cf534D 枚举握手次数
题意:
有n个学生进教室,先后顺序不同,每个人进去后会和当前在教室里的人握手,并且记录人数,而且当教室里有超过三个人的时候 他们有可能组队去参加比赛,后来的人看不到他们。
思路:
这个题目还行挺有意思的,我们可以一个人一个人来模拟,就是枚举握手次数,然后在相应的里面找到一个,如果一个都找不到就-3,到最后就行了,比如一开始我们枚举0,就是握手次数是0的,如果找到有0,那么这个人就是第一个人,如果0的不唯一的话随便挑一个就行,找到后就+1,找握手次数为1的,找到后就是第二个进来的,然后+1,找2的...如果当前握手次数找不到的话就-3,找到就继续,还找不到就还-3,这样如果那次当前枚举次数小于0了,那么就说明失败了,就是无解,还有就是找到的时候不能暴力去找,可以用个二维容器什么的,我用的是前向星配合类似DINIC里面那个优化(职业病啊),比如当前i这个人的握手次数是3,那么就连边3->i,这样当我们想在3里面删除的时候随便找一个就行,删除之后记得这样处理
list[s] = E[k].next,就是下次直接从下一个开始就行,这个地方怎么处理都行,顺手就行,用容器还有链表啥的都行,不多说了,关键是想到枚举握手次数的那个地方就好办了。
#include<stdio.h>
#include<string.h>
#define N_node 200005
#define N_edge 250005
typedef struct
{
int to ,next;
}STAR;
STAR E[N_edge];
int list[N_node] ,tot;
int mkc[N_node];
int Ans[N_node] ,AT;
void add(int a ,int b)
{
//printf("%d %d**\n" ,a ,b);
E[++tot].to = b;
E[tot].next = list[a];
list[a] = tot;
}
int main ()
{
int n ,i ,a ,b;
while(~scanf("%d" ,&n))
{
memset(list ,0 ,sizeof(list)) ,tot = 1;
memset(mkc ,0 ,sizeof(mkc));
for(i = 1 ;i <= n ;i ++)
{
b = i;
scanf("%d" ,&a);
add(a ,b);
mkc[a] ++;
}
int nowc = 0;
AT = 0;
while(nowc >= 0 && AT != n)
{
if(!mkc[nowc]) nowc -= 3;
else
for(int k = list[nowc] ;k ;k = E[k].next)
{
Ans[++AT] = E[k].to;
mkc[nowc]--;
list[nowc] = E[k].next;
nowc ++;
break;
}
//printf("%d\n" ,nowc);
}
if(AT == n)
{
printf("Possible\n");
for(i = 1 ;i <= n ;i ++)
if(i == n) printf("%d\n" ,Ans[i]);
else printf("%d " ,Ans[i]);
}
else printf("Impossible\n");
}
return 0;
}
cf534D 枚举握手次数的更多相关文章
- POJ 2289——Jamie's Contact Groups——————【多重匹配、二分枚举匹配次数】
Jamie's Contact Groups Time Limit:7000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- 通俗理解TCP握手次数是三次
理解之后,应该说是至少三次就可以保证可靠传输了. 看到网上一篇帖子http://www.cnblogs.com/TechZi/archive/2011/10/18/2216751.html是这么说的, ...
- TCP两次握手
TCP的三次握手已经说烂了,TCP为何要三次握手?为何不两次握手也有很多说法.对于这些类似的问题,最好的办法是看RFC 常规思路,由面到点 两军问题 在不可靠通信下,两军想要达到状态一致是无解的.因为 ...
- Tcp连接的七次握手浅析
LINUX 查看tcp连接数及状态 # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 8 ...
- [POJ3977] Subet(二分枚举)
解题报告 前置知识:折半查找法(二分法) 顾名思义,折半就是把一组数据(有序)分成两半,判断我们要找的key值在哪一半当中,不断重复该操作直至找到目标key值,这玩意说白了就是二分的另一个名字. 解决 ...
- POJ 1681 高斯消元 枚举自由变元
题目和poj1222差不多,但是解法有一定区别,1222只要求出任意一解,而本题需要求出最少翻转次数.所以需要枚举自由变元,变元数量为n,则枚举的次数为1<<n次 #include < ...
- Word2Vec源码解析
Reference:http://blog.csdn.net/itplus/article/details/37969519 (Word2Vec解析(部分有错)) 源码:http://pan.bai ...
- 3.24 7.13 Python基础汇总
对象类型 类型名称 示例 简要说明 备注 数字 int,float,complex 1234,3.14,1.3e5,3+4j 数字大小没有限制 十六进制用0x前缀和0-9,a-f表示 字符串 str ...
- Zabbix监控nginx status
nginx开启status ./configure --with-http_stub_status_module nginx.conflocation /statusx35 { stub_status ...
随机推荐
- React函数式组件和类组件[Dan]
一篇对Dan的 How Are Function Components Different from Classes? 一文的个人阅读总结,内容来自于此.强烈推荐阅读 Dan Abramov.的博客. ...
- 推荐模型AutoRec:原理介绍与TensorFlow2.0实现
1. 简介 本篇文章先简单介绍论文思路,然后使用Tensoflow2.0.Keras API复现算法部分.包括: 自定义模型 自定义损失函数 自定义评价指标RMSE 就题目而言<AutoRec: ...
- Java基础 随笔整理
Java基础随笔整理 为了方便阅读,特整理了相关的学习笔记 Java感想 操千曲而后晓声 Java入门 Java其他 Java虚拟机详解 语言入门百题 Java开发工具 · Eclipse Java语 ...
- 【Arduino学习笔记07】模拟信号的输入与输出 analogRead() analogWrite() map() constrain()
模拟信号:Arduino中的模拟信号就是0v~5v的连续的电压值 数字信号:Arduino中的数字信号就是高电平(5V)或者低电平(0V),是两个离散的值 模拟信号->数字信号:ADC(模数转换 ...
- 如何使用excel制作查分系统
在工作学习中,我们经常会遇到使用excel制作查分系统这样的问题.培根说过:读书足以恬情,足以博采,足以长才.因此,面对使用excel制作查分系统我们应该有努力探索的精神.书到用时方恨少,事非经过不知 ...
- tomcat启动错误Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ofuns]];
起初遇到这个问题的时候是在实训(开发环境选择的是IDEA)的时候,检查了半天未果,上网搜索之后,说的也是各式各样,最后发现问题出在web.xml上面 在配置 filter 的 url-pattern ...
- 如何使用python把json文件转换为csv文件
@ 目录 了解json整体格式 转换格式 提取key和value 使用pandas写入csv 了解json整体格式 这里有一段json格式的文件,存着全球陆地和海洋的每年异常气温(这里只选了一部分): ...
- .NetCore 导出Execl
/* Nuget - NPOI.2.5.1 */ using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using NPOI.XSSF.UserMode ...
- Java并发编程之队列
Deque(双端队列) 子接口BlockingDeque,实现类如下: ArrayDeque:大下可变的数组双端队列,不允许插入null LinkedList:大小可变的链表双端队列,允许插入null ...
- 云计算和AI时代,运维应该如何做好转型?
云计算和AI时代,运维应该如何做好转型? 今天我们来聊一聊,在云计算和AI时代,运维应该如何做好转型?今天的内容可以说是我们前面运维组织架构和协作模式转型的姊妹篇.针对运维转型这个话题,谈谈我的思考和 ...