51nod1431 快乐排队

                                                              1431 快乐排队
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
 收藏
 关注

有一群人在排队,如果某个人想排到前面去,可以花一元钱给直接站在他前面的人,然后和这个人交换位置。如果自己没有钱了,就不能和前面的人交换。

但是呢,队列里面的人觉得排他前面的所有人一定要比较有钱的,至少不能比他自己拿的少。否则里面就会有人生气。站在队头的人一定是高兴的。

现在给出一个队列的初始状态,问能不能调整队列,使得里面的人都高兴。

 

样例解释:样例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) {;}
代码

 

posted @ 2017-09-12 15:23  拿叉插猹哈  阅读(124)  评论(0编辑  收藏  举报