51nod快乐排队 1431
生活随笔
收集整理的這篇文章主要介紹了
51nod快乐排队 1431
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
1431 快樂排隊
1.0 秒 131,072.0 KB 80 分 5級題
有一群人在排隊,如果某個人想排到前面去,可以花一元錢給直接站在他前面的人,然后和這個人交換位置。如果自己沒有錢了,就不能和前面的人交換。
但是呢,隊列里面的人覺得排他前面的所有人一定要比較有錢的,至少不能比他自己拿的少。否則里面就會有人生氣。站在隊頭的人一定是高興的。
現在給出一個隊列的初始狀態,問能不能調整隊列,使得里面的人都高興。
樣例解釋:樣例1中,隊尾的人可以和前面的人交換,變成9 10。
輸入
單組測試數據。
第一行包含一個整數n (1 ≤ n ≤ 200,000),表示隊列中的人數。
第二行包含n個空格分開的整數 ai (0 ≤ ai ≤ 10^9),ai表示隊列中第i個人手上拿的錢。編號從隊尾開始。
輸出
對于每一組數據如果能夠使得所有人高興輸出Happy,否則輸出Sad。
輸入樣例
2
11 8
2
9 8
輸出樣例
Happy
Sad
思路:
不知道是不是5級題寫太多了,我都已經快懵圈了
這道題在5級題里面算是一個比較簡單的題目了,如果要進行交換的話,自己的金幣數減一,位置數加一;被交換的那個人,金幣數加一,位置數減一。。
所以每個人的位置數 + 金幣數的和是不變的
我們只需要將a[i] + i,然后去重判斷就好了,有重復就是Sad,沒有重復就是Happy
代碼實現:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<stack> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int,int> pii; const int maxn = 2e5 + 5;int n; int a[maxn]; int b[maxn];int main(){scanf("%d",&n);for(int i = 1;i <= n;i++){scanf("%d",&a[i]);b[i] = a[i] + i;}sort(b + 1,b + 1 + n);int tot = unique(b + 1,b + 1 + n) - b - 1;if(tot != n) printf("Sad\n");else printf("Happy\n");return 0; }總結
以上是生活随笔為你收集整理的51nod快乐排队 1431的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SEO单个网页的最优化操作
- 下一篇: java调起喇叭,【音响知识】调音不求人