[POI2015]Łasuchy
[POI2015]Łasuchy
题目大意:
圆桌上摆放着\(n(n\le10^6)\)份食物,围成一圈,第\(i\)份食物所含热量为\(c_i\)。
相邻两份食物之间坐着一个人,共有\(n\)个人。每个人有两种选择,吃自己左边或者右边的食物。如果两个人选择了同一份食物,这两个人会平分这份食物,每人获得一半的热量。
假如某个人改变自己的选择后(其他\(n-1\)个人的选择不变),可以使自己获得比原先更多的热量,那么这个人会不满意。
问是否存在能使所有人都满意的方案。若存在,请你给每个人指定应该吃哪一份食物。
思路:
动态规划。
\(f[i][j\in[1,4]]\)表示对于第\(i\)个食物,状态为\(j\)的方案数。其中\(j=1\)表示被左边的人吃,\(j=2\)表示被右边的人吃,\(j=3\)表示没有被吃,\(j=4\)表示被两个人吃。
转移的时候枚举当前状态和前一个点的状态,若不会更优则进行转移。
由于是一个环,因此将第\(n\)个食物拆成\(0\)和\(n\)两个食物。一开始枚举\(0\)的状态。DP之后判断一开始枚举到的状态到\(n\)处是否仍旧合法即可。
时间复杂度\(\mathcal O(n)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<cstring>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
const int N=1e6+1;
int c[N],f[N][5],ans[N];
int main() {
const int n=getint();
for(register int i=0;i<n;i++) c[i]=getint();
c[n]=c[0];
for(register int i=1;i<=4;i++) {
memset(f,0,sizeof f);
f[0][i]=1;
for(register int i=1;i<=n;i++) {
if(f[i-1][1]&&c[i]*2>=c[i-1]) f[i][1]=1;
if(f[i-1][3]&&c[i]>=c[i-1]) f[i][1]=3;
if(f[i-1][2]&&c[i-1]*2>=c[i]) f[i][2]=2;
if(f[i-1][4]&&c[i-1]>=c[i]) f[i][2]=4;
if(f[i-1][2]&&c[i-1]>=c[i]) f[i][3]=2;
if(f[i-1][4]&&c[i-1]>=c[i]*2) f[i][3]=4;
if(f[i-1][1]&&c[i]>=c[i-1]) f[i][4]=1;
if(f[i-1][3]&&c[i]>=c[i-1]*2) f[i][4]=3;
}
if(!f[n][i]) continue;
for(register int j=n,k=i;j>=1;j--) {
if(k==1||k==4) ans[j]=j%n+1;
if(k==2||k==4) ans[j%n+1]=j%n+1;
k=f[j][k];
}
for(register int i=1;i<=n;i++) {
printf("%d%c",ans[i]," \n"[i==n]);
}
return 0;
}
puts("NIE");
return 0;
}
[POI2015]Łasuchy的更多相关文章
- BZOJ3749 : [POI2015]Łasuchy
设f[i][S]表示第i份食物被两个人吃的状态为S是否有可能,枚举f[1][]的情况后检验 f[i][0]=(f[i-1][1]&a[i-1]>=a[i])|(f[i-1][3]& ...
- BZOJ 3749: [POI2015]Łasuchy【动态规划】
Description 圆桌上摆放着n份食物,围成一圈,第i份食物所含热量为c[i]. 相邻两份食物之间坐着一个人,共有n个人.每个人有两种选择,吃自己左边或者右边的食物.如果两个人选择了同一份食物, ...
- BZOJ 3749: [POI2015]Łasuchy(贪心)
Orz大佬博客 CODE #include <bits/stdc++.h> using namespace std; typedef long long LL; char cb[1< ...
- @bzoj - 3749@ [POI2015] Łasuchy
目录 @description@ @solution@ @version - 1@ @version - 2@ @accepted code@ @version - 1@ @version - 2@ ...
- [Poi2015]
[POI2015]Łasuchy 一看以为是sb题 简单来说就是每个人获得热量要尽量多 不能找别人 首先这道题好像我自己找不到NIE的情况 很容易想到一个优化 如果一个数/2>另一个数 那么一定 ...
- POI2015题解
POI2015题解 吐槽一下为什么POI2015开始就成了破烂波兰文题目名了啊... 咕了一道3748没写打表题没什么意思,还剩\(BZOJ\)上的\(14\)道题. [BZOJ3746][POI20 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ 4385: [POI2015]Wilcze doły
4385: [POI2015]Wilcze doły Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 648 Solved: 263[Submit][ ...
- BZOJ 4384: [POI2015]Trzy wieże
4384: [POI2015]Trzy wieże Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 217 Solved: 61[Submit][St ...
随机推荐
- python 面试题3
注:本面试题来源于网络. 1.python下多线程的限制以及多进程中传递参数的方式 python多线程有个全局解释器锁(global interpreter lock),这个锁的意思是任一时间只能有一 ...
- 网页中嵌入swf文件的几种方法
1. object + embed 传统的方法 优点:浏览器兼容性好,是 Macromedia 一直以来的官方方法缺点:a.embed 标签是不符合 W3C 的规范的,无法通过验证.当然, ...
- PATH变量重复
命令: export PATH=$(echo $PATH | tr : "\n"| sort | uniq | tr "\n" :) Code: awk -F: ...
- COM组件服务访问权限
解决办法 :添加ASP.NET权限访问COM组件服务. IIS 5 上为 {MACHINE}\ASPNET IIS 6 和 IIS 7 上为网络服务:NETWORK SERVICE IIS 7.5 上 ...
- Python之协程(coroutine)
Python之协程(coroutine) 标签(空格分隔): Python进阶 coroutine和generator的区别 generator是数据的产生者.即它pull data 通过 itera ...
- Django中cookie和session
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- Vue 实现countDown倒计时
项目中要用到倒计时,用Vue 实现了一个 <template> <transition name="bkcd"> <div class="b ...
- java基础54 网络通讯的三要素及网络/网页编程的概述
1.概述 网络编程注意解决的是计算机(手机.平板.....)之间的数据传输问题. 网络编程:不需要基于html基础上,就可以进行数据间的传输.比如:FeiQ.QQ.微信..... ...
- 添加自签发的 SSL 证书为受信任的根证书
原文:http://cnzhx.net/blog/self-signed-certificate-as-trusted-root-ca-in-windows/ 添加自签发的 SSL 证书为受信任的根证 ...
- git —— bug分支
储藏工作现场 $ git stash 切换到需要修改bug的分支,创建临时分支 修复bug,修复完提交 修复完之后,切换到需要修改的分支.完成合并 合并后删除临时分支 完成后,可以重新回到没有修改完的 ...