codefroces中的病毒,这题有很深的trick,你能解开吗?
大家好,欢迎阅读周末codeforces专题。
我们今天选择的问题是contest 1419的C题,目前有接近8000的人通过了本题。今天这题的难度不大,但是真的很考验思维,一不小心就会踩中陷阱,我个人觉得非常有意思,适合周末动动脑。
题目链接:https://codeforces.com/contest/1419/problem/C
题意
有一个叫做Killjoy的特工发明了一种新型的冠状病毒叫做Convid-2069,专门在codeforces平台上传播。这种病毒通过rating传播,只要两个人的rating一样并且其中一个感染了病毒,那么另外一个也会被感染。
这个病毒一开始的时候只有Killjoy自己感染了,他一共和n个人有联系。由于codeforces会定期举办比赛,参加比赛会改变一个人的rating,由于codeforces的规则,导致所有参赛的人的rating变动的总量为0,也就是说有人升了一定会有人降,大家的总和保持不变。已知Killjoy自己不会参赛,请问最少需要多少次比赛可以将所有人都感染。
对于每一次比赛,可以不必所有人都参与,传染的发生不需要时间,瞬间就可以传染。很容易证明,我们一定可以在有限次比赛当中将所有人都感染。
样例
首先输入一个t表示测试数据的组数(),对于每一组数据第一行输入两个数,分别是n和x。n表示和Killjoy有接触的人的数量,x表示Killjoy自己的rating,(
)。
第二行输入n个整数,表示这n个人的rating。要求输出一个整数,表示最少需要的比赛数量()。

题解
这道题的思路非常直接,没什么弯弯绕,我们只需要观察一下样例就可以了。样例当中有三组数据刚好对应了三种情况。
我们先来看第一种情况:这n个人的rating都和x相等,那么意味着我们不需要比赛,就可以把所有人都感染了。结果当然是0,这一种非常简单,大家应该都可以想明白。
第二种情况也不难,第二种情况就是虽然大家的rating不全等于x,但是大家的总和等于x * n。也就是说rating大于x的减小到x,小于x的增加到x,刚好可以通过一次比赛让大家全部被感染,那么最终的答案就是1。这对应样例当中的68, 70的情况,x=69,很明显68的增加1,70的减去1,就可以都变成69。
前面两种理清楚了,再来看第三种情况,第三种情况也就是前面两种都不符合的情况。也就是我们通过一次比赛没办法让大家都等于x,不过这并没有什么关系,因为题目当中并没有限制rating的范围。我们完全可以让其中n-1个人全部变成x,由于要保证大家的rating变动之和等于0,所以让最后一个人来完成平衡的角色。
也就是说通过一次比赛,我们可以让n-1个人全部被感染,最后留下一个人。那么不难想出,我们只需要再多用一个回合就可以了。再多一个回合,我们可以让第n个人变成x,让一个已经感染的人来完成平衡。那么,我们用了两个回合就完成了所有人的感染。
整理一下思路,其实这题分为三种情况,第一种情况是大家全部都等于x,答案是0。第二种情况是大家可以只需要一个回合就变成x,如果上面两种情况都不满足的话,就额外再消耗一个回合即可。
这个思路也太简单了,很快我就写好了代码:
import math
t = int(input())
for _ in range(t):
n, x = list(map(int, input().split(' ')))
arr = list(map(int, input().split(' ')))
diff = 0
sdiff = 0
for i in range(n):
diff += abs(arr[i] - x)
sdiff += arr[i] - x
# 如果所有人都等于x,那么会在一开始就被感染完
if diff == 0:
print(0)
# 如果可以通过一个回合让所有人的rating调整到x,那么只需要一个回合
elif sdiff == 0:
print(1)
else:
print(2)
但是很遗憾,当我提交了之后,并没有AC,而是错在了第二组数据。我想了很久,才终于想到了其中的trick。我先不说,大家先思考一下,看看能不能想到。
准备好了吗?
我们刚才列举的三种情况是没有问题的,但是我们遗漏了一种。就是这一开始的n个人当中,可能有人的rating就等于x,所以他会在第一次比赛之前就感染。我们再想想最后一种情况,我们先把n-1个人的rating调整到x,再把调整当中付出的代价交给其中一个人来承担。这也是我们需要第二个回合的原因,如果这n个人当中存在有人在开始之前就感染了,那么我们完全可以让这个已经感染的人来承担代价,这样我们就可以减少一个回合。
体现在代码当中,就是我们需要额外增加一个判断条件,判断一下这n个人当中是否存在有人的rating等于x,会在一开始的时候就被感染。如果有的话,答案就是1。
附上代码:
import math
t = int(input())
for _ in range(t):
n, x = list(map(int, input().split(' ')))
arr = list(map(int, input().split(' ')))
diff = 0
sdiff = 0
flag = False
for i in range(n):
if arr[i] == x:
flag = True
diff += abs(arr[i] - x)
sdiff += arr[i] - x
if diff == 0:
print(0)
# 如果存在人感染,也只需要一个回合就可以完成感染
elif sdiff == 0 or flag:
print(1)
else:
print(2)
这道题其实并不难,但是很容易漏掉这种情况,这也是codeforces当中题目的魅力所在,考验我们思维的缜密与细致程度。我个人觉得还是非常有趣的,值得一做。
今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发)
本文使用 mdnice 排版
- END -

codefroces中的病毒,这题有很深的trick,你能解开吗?的更多相关文章
- IE中调试JS的一款很好的工具
附件是 IE中调试JS的一款很好用的工具,欢迎下载使用. 具体使用方法为: 1.先安装Companion.JS文件(install.exe). 2.安装Microsoft Script Debu ...
- 修复在“Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决”这篇博客中MyScrollView出现滑动一会就不会上下滑动的问题
在“Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决”,这篇博客中的大部分问题已经解决了. 唯一遗憾的是,ViewPage随人能够工作了,但是My ...
- HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)
Portal Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- C#中的字符串——用Stringbuilder类很重要
注:这篇文章基本是<C#高级编程>(第七版)第九章的学习笔记. 众所周知,C#中处理字符串通常用的都是string,它其实是.NET基础类System.String类的映射.注意一个是小写 ...
- 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现
欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的 ...
- PSD 学位涵义 Poor, Smart and Deep desire to become rich 的缩写,不是真正的学位认证,是对一种心理状态的形容,所谓PSD学位是形容那些贫穷,但是很聪明,很深…_●.×
PSD 学位涵义 Poor, Smart and Deep desire to become rich 的缩写,不是真正的学位认证,是对一种心理状态的形容,所谓PSD学位是形容那些贫穷,但是很聪明,很 ...
- 当xml结构很深时候 可以通过父节点删除子元素
当xml结构很深时候 可以通过父节点删除子元素
- hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。
/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...
- Shade勒索病毒 中敲诈病毒解密 如 issbakev9_Data.MDF.id-A1E.f_tactics@aol.com.xtbl 解决方法
[客户名称]:福建福州市某烘焙连锁企业 [软件名称]:思迅烘焙之星V9总部 [数据库版本]:MS SQL server 2000 [数据库大小]:4.94GB [问题描述]:由于客户服务器安全层薄弱 ...
随机推荐
- Oracle学习(七)游标
一.简介 定义 实质上是数据集,类似数组一样,把查询的数据集存储在内存当中. 使用时可以通过游标指向其中一条记录,也可以通过循环游标达到循环数据集的目的. 游标的种类 显式游标: 使用之前必须得先声明 ...
- NX二次开发-使用NXOPEN C#手工搭建开发环境配置
新建类库 进来后编译代码,成功 添加NXOPEN的库到项目中 不同NX版本,可能dll所在位置不一样,NX11以上版本在NXBIN这里,NX11以下版本大概在UGII. 添加头文件 using NXO ...
- PHP审计基础
php核心配置 register_globals 全局变量注册开关 设置为on时,把GET/POST的变量注册成全局变量 PHP 5.4.0中移除 allow_url_include 包含远程文件 设 ...
- noSql 的应用场景简述
选型一定要结合实际情况而不是照本宣科,比如: 企业发展之初,明明一个关系型数据库就能搞定且支撑一年的架构,搞一套大而全的技术方案出来 有一些数据条件查询多,更适合使用ElasticSearch做存储降 ...
- 第一次的博客-简单的Markdown语法
第一次开通博客 从网上寻找了许多写博客的方法 我觉得对于我来说还是使用 Markdowm 比较容易一些 用我的第一篇博客来记一下一些比较简单常用的Markdown语法 本文参考来源Markdown语法 ...
- win10 配置 maven | 下载与配置
<!-- 阿里云仓库 --> <mirrors> <mirror> <id>nexus-aliyun</id> <mirrorOf&g ...
- 【性能监控-Perfmon工具】Perfmon工具使用教程
一.Perfmon工具简介 Perfmon是一款Windows自带的性能监控工具,提供了图表化的系统性能实时监视器.性能日志和警报管理.通过添加性能计数器可以实现对CPU.内存.网络.磁盘.进程等多类 ...
- CentOS7设置内网时间同步
1.yum 安装 NTP服务器 [root@master ~]# yum -y install ntp 2.启动ntpd服务 [root@master ~]# systemctl start ntpd ...
- centos配置WordPress(Apache+mysql+php)
.安装Apache 安装命令:sudo yum install httpd 启动服务:sudo service httpd start 在浏览器输入IP地址,正常应该显示Apache的欢迎页面 如果提 ...
- CentOS7 执行 service iptables save 报错 The service command supports only basic LSB actions xxxxxx
现象描述 在 CentOS 7.6.1810 下执行 service iptables save 命令,出现如下错误: [root@test ~]# service iptables save The ...