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. 字符串、String等转换

    (1) String 转换为字符串 例:String s = "abcde";char[] a = s.toCharArray(); (2) 字符串转换为Stringchar[] ...

  2. C++拾遗(二)——初窥标准库类型

    本篇博文的开始,先介绍一道书上看到的智力题:有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸.有一台称重精准的天平,只是用一次天平的情况下如何找出比较重的那瓶药丸? 好了,直 ...

  3. LR中订单流程脚本

    Action(){ /* 主流程:登录->下订单->支付订单->获取订单列表 定义事物 1)登录 2)下订单 3)支付订单 4)获取订单列表 接口为:application/json ...

  4. 在hibernate框架中配置显示sql语句

    使用Hibernate的框架开发时,可在Hibernate.cfg.xml中加上 <property name="hibernate.show_sql">true< ...

  5. go语音实战读后感——一

    1.第一个go程序: package main import ( "fmt" ) func main() { fmt.Println("Hello go") } ...

  6. 引入了junit为什么还是用不了@Test注解

    pom文件明明引入了unit,为什么还是用不了@Test? 配置如下: <dependency> <groupId>junit</groupId> <arti ...

  7. syslog(),closelog()与openlog()--日志操作函数 (1)

    文章出处:http://blog.csdn.net/xx77009833/archive/2010/07/30/5776383.aspx 为了满足某些目的,进行日志记录是很有必要的. 在典型的 LIN ...

  8. windows下pycharm使用Anaconda安装包环境

    转自: https://www.cnblogs.com/heitaoq/p/8632315.html

  9. Git学习——查看修改记录

    查看修改结果 修改之前commit的文件,输入下面的而命令,可以查看文件的改动,输入下面命令.还可以采用git diff命令来看看具体修改了什么. 如果确认无误,添加add和提交commit文件. g ...

  10. html2canvas.js网页截图功能

    需求:将网页生成图片,用户自行长按图片进行保存图片,再分享朋友圈.其中,都可识别图中的二维码.(二维码过小会识别不出) 首先,先来科普一下微信网页识别二维码原理:截屏识别,当客户端发现用户在网页的im ...