1431 快乐排队

题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 

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

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

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

样例解释:样例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
思路:可以发现下标加上数值是个定值所以,只要判重就可以了;
 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<stdlib.h>
 4 #include<queue>
 5 #include<map>
 6 #include<stack>
 7 #include<string.h>
 8 #include<iostream>
 9 #define FOR(i,n) for (i = 0;i < n;i++)
10 #define SC(n) scanf("%d",&n);
11 using namespace std;
12 const int BufferSize=1<<16;
13 char buffer[BufferSize],*head,*tail;
14 inline char Getchar()
15 {
16     if(head==tail)
17     {
18         int l=fread(buffer,1,BufferSize,stdin);
19         tail=(head=buffer)+l;
20     }
21     return *head++;
22 }
23 inline int read()
24 {
25     int x=0,f=1;
26     char c=Getchar();
27     for(; !isdigit(c); c=Getchar()) if(c=='-') f=-1;
28     for(; isdigit(c); c=Getchar()) x=x*10+c-'0';
29     return x*f;
30 }
31 int ans[500000];
32 map<int,int>my;
33 int main(void)
34 {
35     int c;
36     c = read();
37     int flag = 0;
38     int i;
39     FOR(i,c)
40     {
41         ans[i] = read();
42         ans[i] = ans[i]+i;
43     }
44     sort(ans,ans+c);
45     int x = ans[0];
46     for(i = 1; i < c; i++)
47     {
48         if(ans[i]==x)
49         {
50             flag = 1;break;
51         }
52         x = ans[i];
53     }
54     if(flag)printf("Sad
");
55     else printf("Happy
");
56     return 0;
57 }

代码库

原文地址:https://www.cnblogs.com/zzuli2sjy/p/5994738.html