bzoj 3749: [POI2015]Łasuchy
来源:互联网 发布:小鲜肉演技知乎 编辑:程序博客网 时间:2024/06/05 17:30
3749: [POI2015]Łasuchy
Time Limit: 10 Sec Memory Limit: 64 MBSec Special JudgeSubmit: 355 Solved: 136
[Submit][Status][Discuss]
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
每个食物有四种状态
①case=0:这个食物没人吃
②case=1:这个食物被左边人吃
③case=2:这个食物被右边人吃
④case=3:这个食物被两边人共享
那么就可以暴力枚举第一个食物的case然后递推就好了
pos[i][case]表示第i-1个食物的状态为pos[i][case]的情况下第i个食物的状态可以为case(也就是前驱)
注意是个环所以第pos[1][case]的前驱应该是第n个食物的状态
如果你枚举的当前第一个食物状态k合法(也就是说pos[1][k]存在前驱)就说明当前是个合法解
递推过程主要是通过当前两个食物的量来判定,程序里有
#include<stdio.h>#include<string.h>int a[1000005], ans[1000005], pos[1000005][4];int main(void){int n, i, k, now;while(scanf("%d", &n)!=EOF){for(i=1;i<=n;i++)scanf("%d", &a[i]);a[n+1] = a[1];for(k=0;k<=3;k++){memset(pos, -1, sizeof(pos));pos[1][k] = 233;for(i=2;i<=n+1;i++){if(~pos[i-1][0]){if(a[i]>=a[i-1]) pos[i][1] = 0;if(a[i]>=a[i-1]*2) pos[i][3] = 0;}if(~pos[i-1][1]){if(a[i]*2>=a[i-1]) pos[i][1] = 1;if(a[i]>=a[i-1]) pos[i][3] = 1;}if(~pos[i-1][3]){if(a[i]*2<=a[i-1]) pos[i][0] = 3;if(a[i]<=a[i-1]) pos[i][2] = 3;}if(~pos[i-1][2]){if(a[i]<=a[i-1]) pos[i][0] = 2;if(a[i]<=a[i-1]*2) pos[i][2] = 2;}}if(~pos[n+1][k]){now = pos[n+1][k];for(i=n;i>=1;i--){if(now==1) ans[(i+n-2)%n+1] = i;if(now==2) ans[i] = i;if(now==3) ans[i] = i, ans[(i+n-2)%n+1] = i;now = pos[i][now];}printf("%d", ans[1]);for(i=2;i<=n;i++)printf(" %d ", ans[i]);break;}}if(k==4)printf("NIE\n");}return 0;}
阅读全文
1 0
- BZOJ 3749 [POI2015]Łasuchy
- bzoj 3749: [POI2015]Łasuchy
- 3749: [POI2015]Łasuchy
- BZOJ3749[POI2015] Łasuchy
- BZOJ3749 POI2015 Łasuchy
- BZOJ3749: [POI2015]Łasuchy
- BZOJ 4385: [POI2015]Wilcze doły
- bzoj 3747: [POI2015]Kinoman
- BZOJ 3747: [POI2015]Kinoman
- BZOJ 3748: [POI2015]Kwadraty
- bzoj 4385 poi2015
- BZOJ 3747: [POI2015]Kinoman
- bzoj 3747 [POI2015]Kinoman
- BZOJ 3747: [POI2015]Kinoman
- BZOJ 3747: [POI2015]Kinoman
- [POI2015] BZOJ 3747 看电影
- BZOJ 4385: [POI2015]Wilcze doły 单调队列
- 【BZOJ 4385】[POI2015]Wilcze doły 单调队列
- lvm逻辑卷和设备的快照
- HDU 4565 -- So Easy! (矩阵幂模板)
- 其他对象
- Unity 中 启动页 滚动 代码实现
- 水波纹特效—Ripple
- bzoj 3749: [POI2015]Łasuchy
- Struts2知识点回顾(六)文件上传与下载
- null和“”,==和equals()的混用和区别
- 树莓派raspberry之samba
- HDOJ 1869 六度分离(floyd最短路~)
- 如何学习代码
- 在ubuntu14.04下openni+opencv+kinectV1的学习一:学习准备
- 树形结构的3种搜索方式示例分享
- BMP图像数据格式详解