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【动态规划】的更多相关文章

  1. BZOJ 3749: [POI2015]Łasuchy(贪心)

    Orz大佬博客 CODE #include <bits/stdc++.h> using namespace std; typedef long long LL; char cb[1< ...

  2. @bzoj - 3749@ [POI2015] Łasuchy

    目录 @description@ @solution@ @version - 1@ @version - 2@ @accepted code@ @version - 1@ @version - 2@ ...

  3. [POI2015]Łasuchy

    [POI2015]Łasuchy 题目大意: 圆桌上摆放着\(n(n\le10^6)\)份食物,围成一圈,第\(i\)份食物所含热量为\(c_i\). 相邻两份食物之间坐着一个人,共有\(n\)个人. ...

  4. bzoj 4386: [POI2015]Wycieczki

    bzoj 4386: [POI2015]Wycieczki 这题什么素质,爆long long就算了,连int128都爆……最后还是用long double卡过的……而且可能是我本身自带大常数吧,T了 ...

  5. 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的时候也可以直接构造 ...

  6. bzoj 4767 两双手 - 动态规划 - 容斥原理

    题目传送门 传送门I 传送门II 题目大意 一个无限大的棋盘上有一只马,设马在某个时刻的位置为$(x, y)$, 每次移动可以将马移动到$(x + A_x, y + A_y)$或者$(x + B_x, ...

  7. BZOJ 4385: [POI2015]Wilcze doły

    4385: [POI2015]Wilcze doły Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 648  Solved: 263[Submit][ ...

  8. BZOJ 4384: [POI2015]Trzy wieże

    4384: [POI2015]Trzy wieże Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 217  Solved: 61[Submit][St ...

  9. Bzoj 3747: [POI2015]Kinoman 线段树

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 553  Solved: 222[Submit][Stat ...

随机推荐

  1. Could not load OpenSSL解决

    问题 Could not load OpenSSL. You must recompile Ruby with OpenSSL support or change the sources in you ...

  2. 系统报错undefine not symbol armv7

    libz.dylib libsqlite3.dylib libstdc++.dylib 添加这些动态链接库

  3. Mybatis-Generator逆向生成Po,Mapper,XMLMAPPER(idea)

    前文有一篇手工生成的说明,地址: http://www.cnblogs.com/xiaolive/p/4874605.html, 现在这个补充一下在idea里面的自动版本的数据库逆向生成工具: 一.g ...

  4. Python之Mac Scrapy爬虫小记

    最近在尝试用Python爬虫,在装Scrapy的过程中遇到了一些麻烦. 上网搜索资料也未能解决command not found scrapy的报错. 最后我删除scrapy,用pip3.6 inst ...

  5. 签名ipa,让其它手机也安装

    开发的时候,需要将app让其它人装上测试,虽然通过xcode可以使用编译进去,但是仍显不方便. 网上有个工具, http://code.google.com/p/iresign/ 通过这个工具,使用自 ...

  6. bootstrap历练实例: 基本胶囊式的导航菜单

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. initWithNibName:bundle awakeFromNib 区别

    initWithNibName:bundle 定义:is a message sent to a view (or window) controller in order to create the ...

  8. ios调试小结

    Xcode底部的小黑盒是我们调试时的好朋友,它可以输出日志信息.错误信息以及其他有用的东西来帮你跟踪错误,除了可以看到日志直接输出的信息外,我们编程过程中也可以在某些断点停留,来检查app的多个方面. ...

  9. ES6变量解构赋值的用法

    一.数组赋值(从数组中提取值,按照对应位置,对变量赋值) 1. 完全解构(变量与值数目相等) let arr = [1, 2, 3]; let [a,b,c] = arr; console.log(a ...

  10. python面向对象编程(OOP)

    python作为一种解释性语言,其主要的编程方式就是面向对象,而且python的框架django也是主要面向对象的编程. 类(class)和对象(object) 类(class)是用来描述具有相同属性 ...