大家好,欢迎阅读周末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,你能解开吗?的更多相关文章

  1. IE中调试JS的一款很好的工具

    附件是 IE中调试JS的一款很好用的工具,欢迎下载使用.  具体使用方法为:  1.先安装Companion.JS文件(install.exe).  2.安装Microsoft Script Debu ...

  2. 修复在“Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决”这篇博客中MyScrollView出现滑动一会就不会上下滑动的问题

    在“Android 在ScrollView中嵌入ViewPage后ViewPage不能很好的工作的问题解决”,这篇博客中的大部分问题已经解决了. 唯一遗憾的是,ViewPage随人能够工作了,但是My ...

  3. HDU 3938 Portal (离线并查集,此题思路很强!!!,得到所谓的距离很巧妙)

    Portal Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  4. C#中的字符串——用Stringbuilder类很重要

    注:这篇文章基本是<C#高级编程>(第七版)第九章的学习笔记. 众所周知,C#中处理字符串通常用的都是string,它其实是.NET基础类System.String类的映射.注意一个是小写 ...

  5. 抓到 Netty 一个隐藏很深的内存泄露 Bug | 详解 Recycler 对象池的精妙设计与实现

    欢迎关注公众号:bin的技术小屋,如果大家在看文章的时候发现图片加载不了,可以到公众号查看原文 本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的 ...

  6. PSD 学位涵义   Poor, Smart and Deep desire to become rich 的缩写,不是真正的学位认证,是对一种心理状态的形容,所谓PSD学位是形容那些贫穷,但是很聪明,很深…_●.×

    PSD 学位涵义 Poor, Smart and Deep desire to become rich 的缩写,不是真正的学位认证,是对一种心理状态的形容,所谓PSD学位是形容那些贫穷,但是很聪明,很 ...

  7. 当xml结构很深时候 可以通过父节点删除子元素

    当xml结构很深时候 可以通过父节点删除子元素

  8. hdu3065 病毒侵袭持续中 AC自动机入门题 N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数。

    /** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的 ...

  9. Shade勒索病毒 中敲诈病毒解密 如 issbakev9_Data.MDF.id-A1E.f_tactics@aol.com.xtbl 解决方法

    [客户名称]:福建福州市某烘焙连锁企业 [软件名称]:思迅烘焙之星V9总部 [数据库版本]:MS SQL server 2000  [数据库大小]:4.94GB [问题描述]:由于客户服务器安全层薄弱 ...

随机推荐

  1. 分享一些好用的 Chrome 插件!

    使用浏览器扩展程序可以使你的工作效率提高数倍不止,那么下面我就向大家分享一下我日常使用的扩展,可能大多数扩展大家都已经在使用了,不过也难免有一两个是你不知道的. 以下排名并不分先后,请坚持看到最后,或 ...

  2. ubuntu 开启samba

    sudo apt-get update sudo apt-get install samba samba-common sudo mkdir /home/vagrant/share sudo chmo ...

  3. SSH 框架常见错误

    新手学习SSH框架的时候总会遇到很多问题,一碰到404 或者500错误就不知道怎么解决. 404错误是很常见的一个错误,如果没有用框架基本上只可能是没有这个路径或者文件,但是用了框架之后404的原因就 ...

  4. Go-常量-const

    常量:只能读,不能修改,编译前就是确定的值 关键字: const 常量相关类型:int8,16,32,64 float32,64 bool string 可计算结果数学表达式 常量方法 iota pa ...

  5. 【漏洞复现】S2-052 (CVE-2017-9805)

    一.漏洞描述 Struts2 的REST插件,如果带有XStream组件,那么在进行反序列化XML请求时,存在未对数据内容进行有效验证的安全隐患,可能发生远程命令执行. 二.受影响版本 Struts2 ...

  6. JavaScript判断字符串中出现次数最多的字符,并统计其次数

    要求: 输出一个给定字符串``中出现次数最多的字符,并统计其次数. 实现思路: 利用charA()遍历这个字符串 把每个字符都存储给对象,如果对象没有该属性,就先幅值为1,如果存在了就+1 遍历对象, ...

  7. CN1,CN2 GT和CN2 GIA的区别

    用一句话来概括,CN1主要定位于承载普通质量的互联网业务,而CN2则定位于承载企业VPN业务.中国电信的自营业务及高质量的互联网业务,CN2 GIA又比GT要好一些. 顺序:CN2 GIA>CN ...

  8. 关于keytool和jarsigner工具签名的使用小结

    在我们日常Android应用开发中,我们都要对我们开发的apk做签名处理,或者加固,增强我们apk的安全性,防止被逆向反编译,在apk签名这块,我们一般采用JDK自动工具来签名,下面就对相关工具做个简 ...

  9. str常用操作方法

    1. 索引(即下标) s = 'ABCDEFGHIJKLMN' s1 = s[0] print('s[0] = ' + s1) #s[0] = A print('s[3] = '+ s[3]) #s[ ...

  10. Makefile-3-书写规则

    目录 前言 概念 Chapter 3:书写规则 3.3 在规则中使用通配符 3.4 文件搜索 3.8 自动生成依赖性 原理 * 直接解析例子 ** sed 命令 参考 书籍 前言 本笔记主要记录Mak ...