CF贪心刷题记录


339A:把一个由数字和加号组成的字符串按照数字从小到大的顺序排序
思路:把字符串s中的所有+过滤掉,然后对数字排序输出。


160A:给n个物品,每件物品有一个价值,现在要求选择最少的物品使得你所选择的物品价值和大于剩余物品的价值和

思路:排序,按照价值从大到小贪心


58A:给一个字符串,判断是否删除若干位可以形成hello

思路:从头开始删除,直到第一位是h,第二位是e,第三四位是ll,最后一位是o


337A:从m个数中选出n个数,使得这n个数中最大与最小的差在所有的C(m, n)组中最小

思路:把这m个数排序,然后枚举起始点,在m - n + 1组中找最小即可。


469A:有n层,A可以到达其中的p层,B可以到达其中的q层,问A,B是否可以到达所有楼层。

思路:开一个数组标记第i层是否可以到达,最后扫描一遍每一层


405A:一个看起来很显然的排序


230A:桐人有一个力量值,有n个boss, 每个boss有力量值和经验值,如果桐人的力量值大于boss的力量值,那么桐人击败

这个boss并且获得boss经验值的力量值奖励(注意是力量值而不是体力值。。)

思路:按照boss力量排序,优先打力量低的一定不会亏。


432A:3人一组,一个人最多参加WF 5次,给n个人和每个人参加已经的次数, 求最后有多少组队伍可以完成k次比赛

思路:对每个人的次数加上k判断是否小于等于5, 大于的话就淘汰,剩下的人数除以3就是结果


490A:3人一组,每个人擅长不同的方面,现在问能够最多选出多少组

思路:针对每个人的特长用3个vector或者一个二维数组存一下这个人,然后选出最小的size就是最大能分的组数,然后for循环输出一下就可以了


588A:有n天,第i天需要a[i]千克的肉,第i天的肉价是p[i],肉保质期无限长,求最少花多少钱可以满足这n天的需求。

思路:第一天的肉是一定要买的,之后记录下到第i天为止最便宜的肉价,每次乘这一天需要的肉的数量累加即可


556A:给一个长度为n的01字符串,每次可以移除相邻的不同的两位字符,问最后剩下的字符串的长度是多少

思路:最后剩下的一定全为0或者全为1, 输出0、1数位差的绝对值即可


149A:给12数,选择最少的数使得这些数的和大于等于k

思路:排序比较


489A*:给一个位数和各个位数字之和,求出符合条件的最大和最小非负整数(不含前导0)

思路:考虑最小数:从高位向低位一位一位走,每一位用一个0~9的循环判断填入这个数是否可行,如果可以就填这个数。最大数反之即可,注意忽略前导0的条件。


439A:演唱n首歌,总共有d分钟,每首歌需要唱a[i]分钟,每两首歌之间有10分钟的休息时间,一个人5分钟可以讲一个笑话,问能否演唱玩所有的歌,如果可以,输出讲笑话的个数,否则输出-1

思路:d - (n - 1) * 10 - ∑a[i] < 0 的话就不可以完成, 否则输出 (d - ∑a[i]) / 5即可

489B:给你两个序列,两个序列中绝对值不超过1的两个元素可以组成1组,求最大的组数

思路:排序后不难证明贪心配对即可(前面的不会影响后面的结果)


701A:把n个数两两一组分成n/2组,使得每组的和相等,题目保证有解

思路:排序后两端的数符合在一组的条件,输出即可


478B:给你n个人,分成m组,每组不能为空,每一组的人互为朋友,问最少和最多有多少对朋友。

思路:由于组合数增长很快,容易猜到(1,1,1,...,n - m + 1)可以得到最多的朋友对数,相对的越平均就会得到越少的对数。会爆int,需要注意一下


349A:有3种面额的货币,100, 50, 25, 一张票25, 现在给n个人和每个人买一张票,一开始你没有钱,问是否能给这n个人全部找钱

思路:用3个计数器记录每个货币的数量,根据第i个人给的金额对应给他找钱即可,如果不可以就输出no


749A:给一个数n,把n拆成尽可能多的素数之和

思路:如果n是偶数,那么输出为 n/2个2, 否则输出 n/2 - 1个2和一个3


732B:给n天每天预定的散步数a[i]和高兴数k,要求相邻2天散步数之和大于等于k,求需要额外增加的散步数和增加后的散步数列

思路:从第二天开始判断是否需要增加即可


520B:给两个数n和m,n每一步可以减1或者乘2, 求n到m的最少需要多少步。

思路:正着从n思考如何变道m不是很容易发现他们间的关系,如果反过来考虑,我们每次把m加1或者除以2,,最后要得到n,就能看出一个重要的关系:如果n >= m,那么直接输出n - m就是结果,因为m变小会离n越来越远;如果n < m,把m分奇偶讨论:如果m是偶数,那么就把m除以2, 否则m先加1在除以2,最后就能得到最少的步数。正着思考的时候因为n为奇和偶的时候都可以乘2,所以不好判断。


461A::题目看起来挺复杂,有两个人,一个长度为n的序列,每一次A把序列的所有和加起来加给总分,然后把序列交给B,B把序列中的某一个元素加给总分然后删除,然后再把序列分成两个非空的部分交给A,重复操作直到序列为空。最后问最大的总分是多少

思路:数值越大的序列尽可能多加,因此去掉的数就应该是每次序列中最小的那个,对序列排序,每次减掉最小的即可。


507A:有n和k两个数和一个长度为n的序列,要求找出尽可能多的数使得他们的和不超过k

思路:排序后从小到大累加即可


519C:有n位专家和m位新手,有两种分配方式,一种是一位专家两位新手一组,一种是两位专家一位新手一组,问最多可以分成多少组

思路:如果n * 2 > m, 就按照第二种方式分组,否则按照第一种方式分组





你可能感兴趣的:(codeforces,贪心,刷题记录)