Codeforces Round #298 (Div. 2) D. Handshakes(贪心)

来源:互联网 发布:linux session数量 编辑:程序博客网 时间:2024/06/05 18:16

题目:

http://codeforces.com/contest/534/problem/D

好水的D题=.= 

vecotr大法,加递推.

AC.

#include <iostream>#include <cstdio>#include <vector>using namespace std;const int maxn = 2e5+5;vector<int> v[maxn];int ans[maxn];int main(){//freopen("in", "r", stdin);    int n;    while(~scanf("%d", &n)) {        for(int i = 0; i < n; ++i) v[i].clear();        for(int i = 1; i <= n; ++i) {            int a;            scanf("%d", &a);            v[a].push_back(i);        }        int cnt = 0, s = 0;        while(1) {            int tmp = s;            if(v[cnt].size()) {                ans[s++] = v[cnt][v[cnt].size()-1];                v[cnt].pop_back();                cnt++;            }            else if(cnt - 3 >= 0) {                while(v[cnt].empty()) cnt -= 3;                if(cnt >= 0 && v[cnt].size()) {                    ans[s++] = v[cnt][v[cnt].size()-1];                    v[cnt].pop_back();                    cnt++;                }            }            //printf("%d %d\n", cnt, ans[s-1]);            if(tmp == s || s == n || cnt < 0) break;        }        if(s == n) {            printf("Possible\n");            printf("%d", ans[0]);            for(int i = 1; i < s; ++i) {                printf(" %d", ans[i]);            }            printf("\n");        }        else printf("Impossible\n");    }    return 0;}


0 0
原创粉丝点击