[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 ...
随机推荐
- ActiveMQ与SpringMVC整合实现发送PTP和订阅发布消息功能
实现一个基于SpringMVC+JMS+ActiveMQ+Tomcat+JDK1.8+IDEA工具 ,Spring4.1.0和ActiveMQ5.15整合的实例,实现PTP和订阅/发布两种消息模型 一 ...
- mybatis查询参数为0时无法识别问题
最近在工作中遇到一个mybatis参数问题,主要是列表查询按照状态进行过滤,其中已完成状态值是0,被退回是1.如图所示 , 然后Mapper里面是和平常一样的写法<if test="s ...
- 空洞卷积(dilated Convolution) 与感受野(Receptive Field)
一.空洞卷积 空洞卷积是是为了解决基于FCN思想的语义分割中,输出图像的size要求和输入图像的size一致而需要upsample,但由于FCN中使用pooling操作来增大感受野同时降低分辨率,导致 ...
- vue总结07 常用插件
插件 开发插件 插件通常会为 Vue 添加全局功能.插件的范围没有限制——一般有下面几种: 添加全局方法或者属性,如: vue-custom-element 添加全局资源:指令/过滤器/过渡等,如 v ...
- Python 内置装饰器
内置的装饰器 内置的装饰器和普通的装饰器原理是一样的,只不过返回的不是函数,而是类对象,所以更难理解一些. @property 在了解这个装饰器前,你需要知道在不使用装饰器怎么写一个属性. d ...
- [新手]在macOS环境下安装xdebug
使用环境 masOS 10.12 使用MAMP安装的PHP环境 在新安装的系统中,安装xdebug,遇到了一些小问题; P.S. 重新按照xdebug官网的指南安装了一次,把上次安装失败的xd ...
- wordpress后台进去空白怎么办?
最近博客换成了用wordpress程序搭建,内容和版面也重新设计.经常使用FTP工具,更改模板或者其他程序文件.由于对wordpress不太了解,竟然出现了wordpress后台进去空白的问题,而前台 ...
- mongo体系架构学习
MongoDB是一个可移植的数据库,它在流行的每一个平台上都可以使用,即所谓的跨平台性,在不同的操作系统上虽然略有差别,但是从整体架构上来看,MongoDB在不同的平台上是一样的,如数据逻辑结构和数据 ...
- 005 Hadoop的三种模式区别
1.本地模式 -默认模式. -不对配置文件进行修改. -使用本地文件系统,而不是分布式文件系统. -Hadoop不会启动NameNode.DataNode.ResourceManager.NodeMa ...
- 取得项目的 Git 仓库
有两种取得 Git 项目仓库的方法.第一种是在现存的目录下,通过导入所有文件来创建新的 Git 仓库.第二种是从已有的 Git 仓库克隆出一个新的镜像仓库来. 在工作目录中初始化新仓库 要对现有的某个 ...