Handshakes

题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=150371

题意:

输入n,表示有n个人将会进入房间,且每个进入的人都要和房间里的每个人握手一次。在任何时候任何三名学生可以参加一个团队比赛,这一直持续到一天结束的比赛。进来的人不需要再和比赛的人握手。让每个人1~n编号,输入的第二行表示可能每个编号握手次数,问是否可能是这个次数,如果有可能就输出Possible,并且输出可能的进入房间的顺序。不可能则输出Impossible。

注意:可以一次有几组三名同学参加团队比赛。

案例:

1)input

5

2 1 3 0 1

output

Possible

4 5 1 3 2

2)input

4

0 2 1 1

output

Impossible

思路分析:

有0,1,2,3...n种握手次数,而每种次数含有的人数有多有少,而再进门后就不在需要排列这个人,即需要把这种情况去掉,所以用不定长数组vetor是最好的选择。

房间有x个人就需要握手x次,这先在寻找握手x次的人是否为空,不为空则找到其中一人存入新数组,否则,就要让房间中的人去比赛,每次去3个,找到寻找握手x-3次的人是否为空,如果还是为空,则再去3个人。直到不为空跳出循环(剩下的人数为x-比赛人数+1),或直到正常离开循环跳出大循环。

注意:输出时末尾是没有空格的。

源代码如下:

 1 #include<iostream>
 2 #include<vector>
 3 #define maxn 200000
 4 using namespace std;
 5 vector<int>a[maxn];
 6 int b[maxn];
 7 int main()
 8 {
 9     int n,i,s=0,x=0,m;
10     cin>>n;
11     for(i=0;i<n;i++)
12     {
13         cin>>m;
14         a[m].push_back(i+1);
15     }
16     while(s<n)               //判断是否可能
17     {
18         if(!a[x].empty())               //判断是否需要有人去比赛
19         {
20             b[s++]=a[x][a[x].size()-1];
21             a[x].pop_back();
22             x++;
23         }
24         else
25         {
26             for(i=3;i<=x;i=i+3)
27                 if(!a[x-i].empty())
28                 {
29                     b[s++]=a[x-i][a[x-i].size()-1];
30                     a[x-i].pop_back();
31                     break;
32                 }
33             if(i>x)break;
34             x=x-i+1;
35         }
36     }
37     if(s>=n)
38     {
39         cout<<"Possible"<<endl<<b[0];
40         for(i=1;i<n;i++)
41             cout<<" "<<b[i];
42         cout<<endl;
43     }
44     else
45         cout<<"Impossible"<<endl;
46     return 0;
47 }
时间: 2024-10-09 02:42:49

Handshakes的相关文章

2016 省赛热身 Handshakes

Handshakes Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Description Last week, n students participated in the annual programming contest of Marjar University. Students are labeled from 1 to n. They came to the competitio

Codeforces 534D Handshakes(贪心)

题意   房子里有n个人走进来  编号1~n  每个人走进来时房子里所有空闲的人都会和他招手  空闲的某三个人可以选择一起去打比赛  当然打比赛就变得不空闲了  给你每个人进来时和他招手的人的数量  要求输出一种可能的进房间顺序 没有可能的就输出Impossible 这题放在d就比较简单了  直接贪心就可以  把招手数量为i对应的人都保存到栈s[i]里  第一个进房间的人肯定是s[0]里的  然后让i从0开始  s[i]非空时  让s[i]的栈顶的人进入房间  然后i++  否则让s[i-1],

URAL 1194. Handshakes (乱搞)

1194. Handshakes Time limit: 1.0 second Memory limit: 64 MB A party at the "Prancing Pony" tavern was over and the hobbits were breaking up. At the first crossroad all the company fell into several groups, each of which went its own way. As a ma

LeetCode 1259. Handshakes That Don&#39;t Cross

一.原题描述 You are given an even number of people num_people that stand around a circle and each person shakes hands with someone else, so that there are num_people / 2 handshakes total. Return the number of ways these handshakes could occur such that no

LeetCode 1259. Handshakes That Don&#39;t Cross - Java - DP

题目链接:https://leetcode-cn.com/problems/handshakes-that-dont-cross/ You are given an?even number of people num_people?that stand around a circle and each person shakes hands?with someone else, so that there are num_people / 2 handshakes total. Return t

#298 (div.2) D. Handshakes

1.题目描述:点击打开链接 2.解题思路:本题是一道模拟题.要求找出一个队列,使得队列中的每个人的握手次数符合输入的情况,如果不存在输出无解.其中每三个人可以在任何时刻组成一个队伍开始比赛,后面的人不能再与他们握手.通过手动操作与观察可以发现,如果把队列中的人的握手次数均取除以3后的余数.那么正好形成0 1 2 0 1 2....的循环序列.所以可以通过这个来模拟该过程.事先用map保存握手次数i下对应的列表.接下来用一个变量j控制所到达的握手次数,如果发现j≥3且此时的队列为空,那么就缩小3看

Codeforces534D:Handshakes

On February, 30th n students came in the Center for Training Olympiad Programmers (CTOP) of the Berland State University. They came one by one, one after another. Each of them went in, and before sitting down at his desk, greeted with those who were

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

题意:总共有N个人进入教室,   每次进入的时候会和教室里面原有的人握手,并且记录握手的次数,当教室里面有大于等于三个人的时候,任意三个人可以组队去比赛(后面近来的人将无法看到他们), 现在给出人数N    给出乱序的人的握手次数,问是否可以组成一个合法的序列 题解: 一个人一个人往教室里走,  每次看看当前握手次数的询问是否还有,  如果还有 直接用当前握手次数否则将退回当前次数减3的次数继续查询,当查询合法后将序号放入数组存下.当查询到某个次数减到负数之后退出,查询数组长度是否大于N 代码:

Codeforces 534D Handshakes 构造 模拟 贪心

题意:人们依次进大厅,后进来的人会和里面所有的人都握手, 大厅里面有三个人就 其中丧二恩就可以结伴走出大厅.给你每个人进大厅时候握手的次数.让你求一个进场顺序. 解题思路:比赛的时候是用的从后往前推.比较难,发现从前往后直接模拟就行了 . 解题代码: 1 // File Name: d.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月13日 星期一 01时30分17秒 4 5 #include<vector> 6 #include&l