51nod 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
可以把位置看做另一部分钱
因为位置交换会使位置+1 金钱-1
这样位置+金钱是个定值
所以只需要排序去重就可以
脑洞题。。
#include <algorithm> #include <cstring> #include <cstdio> #define N 205000 using namespace std; int zs[N],n,t,sum; int main() { memset(zs,0,sizeof(zs)); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&zs[i]); zs[i]+=i; } sort(zs+1,zs+n+1); int i; for(i=2;i<=n;i++) if(zs[i-1]==zs[i]) break; if(i==n+1) printf("Happy\n"); else printf("Sad\n"); return 0; }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。