Codeforces 534D - Handshakes(構造,暴力)

題意:總共有N個人進入教室,   每次進入的時候會和教室裏面原有的人握手,並且記錄握手的次數,當教室裏面有大於等於三個人的時候,任意三個人可以組隊去比賽(後面近來的人將無法看到他們), 現在給出人數N    給出亂序的人的握手次數,問是否可以組成一個合法的序列 

題解:

一個人一個人往教室裏走,  每次看看當前握手次數的詢問是否還有,  如果還有 直接用當前握手次數否則將退回當前次數減3的次數繼續查詢,當查詢合法後將序號放入數組存下。當查詢到某個次數減到負數之後退出,查詢數組長度是否大於N

代碼:

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
vector<int> value; 
struct Node
{
    int coun;
    vector<int> mark;    
}cun[200005];
int main()
{
   int n, a;
   while(scanf("%d", &n) != EOF)
   {
       value.clear();
       for(int i = 0; i < 200005; i++)
       cun[i].mark.clear(), cun[i].coun = 0;
       for(int i = 1; i <= n; i++)
       scanf("%d", &a), cun[a].coun++, cun[a].mark.push_back(i);  
       int i = 0;
       while(i >= 0)
       {
            if(cun[i].coun) 
            {
                cun[i].coun --;
                value.push_back(cun[i].mark.back());
                cun[i].mark.pop_back();
                i++;
            }   
            else i -= 3;
       }        
       if(value.size() != n)    printf("Impossible\n");
       else
       {
           printf("Possible\n");
           printf("%d", value[0]);
           for(int i = 1; i < n; i++)
           {
              printf(" %d", value[i]);        
           }    
           printf("\n");
       }       
   }     
}
 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章