标签:
题意:总共有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");
}
}
}
Codeforces 534D - Handshakes(构造,暴力)
标签:
原文地址:http://blog.csdn.net/q651111937/article/details/45876241