題意:總共有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");
}
}
}