BZOJ 3749: [POI2015]Łasuchy【动态规划】
Description
圆桌上摆放着n份食物,围成一圈,第i份食物所含热量为c[i]。
相邻两份食物之间坐着一个人,共有n个人。每个人有两种选择,吃自己左边或者右边的食物。如果两个人选择了同一份食物,这两个人会平分这份食物,每人获得一半的热量。
假如某个人改变自己的选择后(其他n-1个人的选择不变),可以使自己获得比原先更多的热量,那么这个人会不满意。
请你给每个人指定应该吃哪一份食物,使得所有人都能够满意。
Input
第一行一个整数n(2<=n<=1000000),表示食物的数量(即人数)。食物和人都从1~n编号。
第二行包含n个整数c[1],c[2],…,c[n](1<=c[i]<=10^9)。
假设第i个人(1<=i<n)左边是第i份食物,右边是第i+1份食物;而第n个人左边是第n份食物,右边是第1份食物。
Output
如果不存在这样的方案,仅输出一行NIE。
如果存在这样的方案,输出一行共n个整数,第i个整数表示第i个人选择的食物的编号。如果有多组这样的方案,输出任意一个即可。
Sample Input
5
5 3 7 2 9
Sample Output
2 3 3 5 1
思路:敲到吐血的题,其实这货就是微观经济学中的帕累托有效率嘛
这题第一眼看:傻逼题,枚举第一个人吃左边还是右边的食物,那第二个人选择左边还是右边就是固定的了,还想到了个貌似靠谱的优化:如果左边(或者右边)的数大于右边(或者左边)的数的两倍,那毋庸置疑是吃左边(右边)的。
然后我就WA了一下午。。。后来才发现思路错了
转换思路后,考虑O(n)的算法,dp[i][s]表示第i份食物吃的状态,1表示这份食物被左边的人吃,2表示这份食物被右边的人吃,3表示被两边的人吃,4表示两边的人都不吃这份食物,然后就可以转移了。什么?dp想出状态转移就很快出来了?唔 你可以试下这题。。。关键不在于转移很难想,而是细节很麻烦,注意什么时候乘二,符号是大于还是等于,之类的细节,最好在纸上画一下
顺便给两组数据:
10
8 7 3 10 5 2 1 3 8 4
ans:
1 2 4 4 5 6 8 9 9 10
3
10 1 10
ans:
1 3 3
//dp[i][1] left dp[i][2] right
//dp[i][3] both dp[i][4] none
#include<cstdio>
#include<string.h>
#define maxn 1000005
using namespace std;
int n,a[maxn],path[maxn][5],ans[maxn];
int work(int u){
memset(path,0,sizeof(path));path[1][u]=1;
for(int i=2;i<=n;i++){
if(path[i-1][1]&&(a[i-1]<=2*a[i]))path[i][1]=1;
if(path[i-1][4]&&(a[i-1]<=a[i]))path[i][1]=4;
if(path[i-1][2]&&(a[i-1]*2>=a[i]))path[i][2]=2;
if(path[i-1][3]&&(a[i-1]>=a[i]))path[i][2]=3;
if(path[i-1][1]&&(a[i-1]<=a[i]))path[i][3]=1;
if(path[i-1][4]&&(a[i-1]*2<=a[i]))path[i][3]=4;
if(path[i-1][2]&&(a[i-1]>=a[i]))path[i][4]=2;
if(path[i-1][3]&&(a[i-1]>=a[i]*2))path[i][4]=3;
}if(path[n][u]==0)return 0;
for(int i=n;i>=1;i--){
if(u==1)ans[i-1]=(i-1)%(n-1)+1;if(u==2)ans[i]=(i-1)%(n-1)+1;
if(u==3)ans[i-1]=ans[i]=(i-1)%(n-1)+1;
u=path[i][u];
}
for(int i=1;i<n-1;i++)printf("%d ",ans[i]);
printf("%d\n",ans[n-1]);
return 1;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);a[++n]=a[1];
for(int i=1;i<=4;i++)if(work(i))return 0;
printf("NIE\n");
return 0;
}
BZOJ 3749: [POI2015]Łasuchy【动态规划】的更多相关文章
- 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]Łasuchy
[POI2015]Łasuchy 题目大意: 圆桌上摆放着\(n(n\le10^6)\)份食物,围成一圈,第\(i\)份食物所含热量为\(c_i\). 相邻两份食物之间坐着一个人,共有\(n\)个人. ...
- bzoj 4386: [POI2015]Wycieczki
bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了 ...
- BZOJ #3746: [POI2015]Czarnoksiężnicy okrągłego stołu 动态规划
转载请注明出处:http://www.cnblogs.com/TSHugh/p/8823423.html 读完题就会发现p=0.1的情况以及n=1.2的情况都可以直接判掉,而p=2的时候也可以直接构造 ...
- bzoj 4767 两双手 - 动态规划 - 容斥原理
题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, ...
- 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 ...
- Bzoj 3747: [POI2015]Kinoman 线段树
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 553 Solved: 222[Submit][Stat ...
随机推荐
- Could not load OpenSSL解决
问题 Could not load OpenSSL. You must recompile Ruby with OpenSSL support or change the sources in you ...
- 系统报错undefine not symbol armv7
libz.dylib libsqlite3.dylib libstdc++.dylib 添加这些动态链接库
- Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(idea)
前文有一篇手工生成的说明,地址: http://www.cnblogs.com/xiaolive/p/4874605.html, 现在这个补充一下在idea里面的自动版本的数据库逆向生成工具: 一.g ...
- Python之Mac Scrapy爬虫小记
最近在尝试用Python爬虫,在装Scrapy的过程中遇到了一些麻烦. 上网搜索资料也未能解决command not found scrapy的报错. 最后我删除scrapy,用pip3.6 inst ...
- 签名ipa,让其它手机也安装
开发的时候,需要将app让其它人装上测试,虽然通过xcode可以使用编译进去,但是仍显不方便. 网上有个工具, http://code.google.com/p/iresign/ 通过这个工具,使用自 ...
- bootstrap历练实例: 基本胶囊式的导航菜单
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- initWithNibName:bundle awakeFromNib 区别
initWithNibName:bundle 定义:is a message sent to a view (or window) controller in order to create the ...
- ios调试小结
Xcode底部的小黑盒是我们调试时的好朋友,它可以输出日志信息.错误信息以及其他有用的东西来帮你跟踪错误,除了可以看到日志直接输出的信息外,我们编程过程中也可以在某些断点停留,来检查app的多个方面. ...
- ES6变量解构赋值的用法
一.数组赋值(从数组中提取值,按照对应位置,对变量赋值) 1. 完全解构(变量与值数目相等) let arr = [1, 2, 3]; let [a,b,c] = arr; console.log(a ...
- python面向对象编程(OOP)
python作为一种解释性语言,其主要的编程方式就是面向对象,而且python的框架django也是主要面向对象的编程. 类(class)和对象(object) 类(class)是用来描述具有相同属性 ...