A. Mahmoud and Ehab and the MEX
题目链接:https://codeforces.com/problemset/problem/862/A
题意
对于一个集合,它的mex就是集合里所不包含的最小的非负整数
比如集合{1, 2, 3}的mex是0,集合{0, 1, 2, 4}的mex是3
给你一个集合s,和一个数x
现在可以有如下操作:
- 往集合里加一个数
- 往集合里删一个数
要求你操作最少的次数,使得集合s的mex是x。
思路
- 如果集合s里没有x,那么把集合里不存在的并且比x小的数都补进去,这样子比x小的数都存在了,那么x就是第一个集合里不存在非负整数。
- 如果集合s里有x,那么需要把集合里的x删掉,然后把集合里“不存在的并且小于x的数”都加到集合里,这样子集合里不存在的非负整数就是x了。
代码
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
B.If at first you don't succeed...
题目链接
https://codeforces.com/problemset/problem/991/A
题意
一共有n个人,有a个人去过A餐厅,有b个人去过B餐厅,还有C个人两个餐厅都去过。问有多少个人没去过餐厅?
注:如果没有人没去过餐厅则输出-1(题目故事背景要求)
如果给出的数据是矛盾的造成局面不合法则输出-1。至于哪种不合法,思路里讲
思路
不合法的条件是啥呢?
比如说有3个人去了A餐厅,5个人去了B餐厅,然后告诉你有4个人两个餐厅都去过,这是相互矛盾的,因为只有3个人去了A餐厅,后面却说有4个人两个餐厅都去过。
如果局面是合法的,那么去了餐厅的人数就是a + b - c
。不去餐厅的人数就是n - (a + b - c)
。
代码
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
C.Urbanization
题目链接
https://codeforces.com/problemset/problem/735/B
题意
有n个居民,他们有不同数量的财产,现在要搬到两个城市city1和city2,其中有citiy1能容纳n1个居民,city2能容纳n2个居民,政府给居民发发出n1和n2个offer给居民分别到city1和city2。如果没有收到offer就不搬(可以忽略不计了)。政府想要新的城市city1的财产平均值和city2的财产平均值之和尽可能大,求这个平均值之和。
思路
我猜的结论hhh。把收入做个排序。假设n1和n2的最小值是a,最大值是b
然后让收入最高的前a人去住人数最少的那个城市,然后从a + 1到a + b个人(也就是出去前a个人之后的b个人)去住人数最多的那个城市。这样子就能达到平均收入值最高。
代码
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
D. Proper Nutrition
链接
https://codeforces.com/gym/245430/problem/D
题意
给出x, y, n。问有没有非负整数a, b。使得a * x + b * y == n
思路
这题太简单了,我们不要n方枚举,n枚举,枚举x的倍数t = i * x(i >= 0)
,然后看n - t对y是否整除。如果整除则i和(n - i * x) / y就是答案。
代码
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
E.Developing Skill
题目链接
https://codeforces.com/problemset/problem/581/C
题意
有n个角色,第i个角色有技能点a[i]。然后总的攻击力是每个a[i] / 10
向下取整的和。
现在有k次提升,每次提升可以让一个角色的i的技能点加1。加到100为止(每个角色的技能点不能超过100)。
思路
我写得比较挫。。
这题是个贪心,就是优先把那些个位数接近10的补到10(十位数进一的意思),补到10的话除以十向下取整就会多加1。如果把所有的都补到10之后,k还剩的话,那就把不满100的补到100。
开了一个只有一个整数的结构体,然后重载了这个结构体的比较函数cmp,让他们按照%10的结果从大到小排序,这样子就能优先补那些个位数距离10比较近的。
然后补完了如果k还剩的话,再来一个按照模10距离从小到大排序,这样子的话之前那些被补到正常的从大到小排序,如果当前角色的技能点小于100,就给补到100,如果k不够补到100了,那就把所有k都给它补了。
最后再记他们除10向下取整的和就好了。
代码
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
F. Cyclic Components
题目链接
https://codeforces.com/problemset/problem/977/E
题意
给若干个点,和若干条边。然后问有多少个环?
注:这里的环是指一个联通分支组成一个且只一个环。
思路
一个很重要的结论:一个环上的所有点的度数都等于2.
我没想到这个结论,队友告诉我才把题补了。
判断一个联通分支里的节点的度数是不是都为2。如果是的话这个联通分支就是环。那么有两种方法判断联通分支,一种是dfs一种是并查集。
但并查集的时候要注意一下,如果两个元素已经连接了,就不需要再连了(这虽然说废话但我忘了写,就犯了一个小错误hhh)并查集加上路径压缩才能过!
代码
dfs版
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
并查集版
// #pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include