51nod1431 快乐排队
收藏
关注
有一群人在排队,如果某个人想排到前面去,可以花一元钱给直接站在他前面的人,然后和这个人交换位置。如果自己没有钱了,就不能和前面的人交换。
但是呢,队列里面的人觉得排他前面的所有人一定要比较有钱的,至少不能比他自己拿的少。否则里面就会有人生气。站在队头的人一定是高兴的。
现在给出一个队列的初始状态,问能不能调整队列,使得里面的人都高兴。
样例解释:样例1中,队尾的人可以和前面的人交换,变成9 10。
Input
单组测试数据。 第一行包含一个整数n (1 ≤ n ≤ 200,000),表示队列中的人数。 第二行包含n个空格分开的整数 ai (0 ≤ ai ≤ 10^9),ai表示队列中第i个人手上拿的钱。编号从队尾开始。
Output
对于每一组数据如果能够使得所有人高兴输出Happy,否则输出Sad。
Input示例
2 11 8 2 9 8
Output示例
Happy Sad
对于一个i 如果 向左交换 会收到一块钱 位置减1
向右交换 会减少一块钱 位置加 1 所以 钱数+位置编号无论怎么换都不会变
1 #include <cstdio> 2 #include <cctype> 3 #include <algorithm> 4 5 const int MAXN=1000010; 6 7 int T,n,ans; 8 9 int zs[MAXN]; 10 11 inline void read(int&x) { 12 int f=1;register char c=getchar(); 13 for(x=0;!isdigit(c);c=='-'&&(f=-1),c=getchar()); 14 for(;isdigit(c);x=x*10+c-48,c=getchar()); 15 x=x*f; 16 } 17 18 int hh() { 19 while(~scanf("%d",&n)) { 20 for(int i=1;i<=n;++i) {read(zs[i]),zs[i]+=i;} 21 std::sort(zs+1,zs+1+n); 22 int t=std::unique(zs+1,zs+1+n)-zs-1; 23 if(t==n) printf("Happy\n"); 24 else printf("Sad\n"); 25 } 26 return 0; 27 } 28 29 int sb=hh(); 30 int main(int argc,char**argv) {;}
作者:乌鸦坐飞机
出处:http://www.cnblogs.com/whistle13326/
新的风暴已经出现
怎么能够停止不前
穿越时空 竭尽全力
我会来到你身边
微笑面对危险
梦想成真不会遥远
鼓起勇气 坚定向前
奇迹一定会出现