码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-21 09:11:48      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

题意:总共有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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!