AtCoder Context ABC 104 C All Green(绿色全开)

运行要求
运行时间限制: 2sec
内存限制: 1024MB
原题链接
AtCoder Beginner Contest 104 C

题目
代码竞技平台AtCoder为大家提供算法综合选集大全算法综合选集大全里面含有多个问题选集。每个问题选集根据难度,给定相应的分数。现在有一个整数i,1 <=i <= D,D为某个特定的整数。问题选集的编号是i。对于编号为i的问题选集里面的题目,每解决一题,给定100*i的分数。我们给定的算法综合选集大全涵盖了编号为1,2,3...D的问题选集。对于编号为i的问题选集,里面有Pi个题目,全部解决编号为i的问题选集里面的Pi个题目,用户可以获得Ci的额外奖金积分

Atcoder对于每个用户都给定一个综合分数。用户的综合分数有以下的部分组成

  1. 基本分数:用户解题获得的分数的总和
  2. 奖金分数:用户解决某一个问题选集后获得的奖金积分

AtCoder的新用户小明现在还没有解题。小明的目标是获得G以上的得分。请问,小明至少要解题多少题才能够达到要求。

输入前提条件

  • 1 <= D <= 10
  • 1 <= Pi <= 100
  • 100 <= Ci <= 1000000
  • 100 <= G
  • 所有输入的都为整数
  • Ci和G都为100的倍数
  • 理论上输入的选项满足能够达到G以上的可能

输入
输入都以以下标准从命令行输入

D G
p1 c1
.
.
pD cD

输出
请输出能够达到G以上积分所需要解题的最少的数量※请放心给出的测试输入肯定是能够达到G以上的积分的

例1
输入

2 700
3 500
5 800

输出

3

从给定的题目信息中可以看出,一定有2个问题选集
第1个问题选集,里面一共有3道题目,每一题价值100分,3道题都解出来的话可以拿到500分的奖金积分。
第2个问题选集,里面一共有5道题目,每一题价值200积分,5道题都解出来的话可以拿到800分的奖金积分。小明的目标分数为700分。
能够达到目标的
第1个方法,第2个问题选集完成5道题里面的4道题,获得800个积分。
第2个方,把第1个问题选集解出来的话,可以获得额外的500分积分,这样也能获得800积分
第2个方法只需要解3道题目,比第一个方法需要解的题目要少

例2
输入

2 2000
3 500
5 800

输出

7

虽然和例1的输入很类似,但是因为目标分数是2000分,所以必须把价值200分的5道题目全部解答获得1800分,然后再解2道价值100分的题目。

例3
输入

2 400
3 500
5 800

输出

2

虽然和例1的输入很类似,但是因为目标分数是400分,所以只需要解题价值200分的题目2题

例4
输入

5 25000
20 1000
40 1000
50 1000
30 1000
1 1000

输出

66

虽然价值500分的题目只有一题,但是可以获得完整的奖金积分


读懂题目
简单说就是这样子的
问题选集1 一共P1道题 每一题 100分 全部解题完毕 C1分的奖金
问题选集2 一共P2道题 每一题 200分 全部解题完毕 C2分的奖金
问题选集3 一共P3道题 每一题 300分 全部解题完毕 C3分的奖金
问题选集4 一共P4道题 每一题 400分 全部解题完毕 C4分的奖金
问题选集5 一共P5道题 每一题 500分 全部解题完毕 C5分的奖金

解题思路

1. 如果没有奖金积分制度的话,那么我们就从分数最高的问题选集开始解题,消耗完库存后再解题分数第二高的问题选集

2. 但是有了奖金制度怎么办呢,因为有些问题选集就算给的积分很低,但是它的奖金很高,那么我们也应该要选择这样的问题选集

3. 有没有存在这样的情况,两个问题选集全部完成,2个问题选集部分完成
答案是否定的,因为,每一个问题选集的奖金都不一样,分值也不一样,如果存在A问题选集完成一部分,B问题选集完成一部分。B问题选集的分值比A问题选集要高,那么为什么不把做A选题的精力投入到解决问题选集里面呢,这样的话可以获得更高的分数。
AtCoder Context ABC 104 C All Green(绿色全开)_第1张图片

AtCoder Context ABC 104 C All Green(绿色全开)_第2张图片

我们可以从上面的两张图的对比发现,把算力分散到两个选题集是在总得分上吃亏的,因为另外一个得分高的选题集存在,可以把算力投入到得分更高的选题集里拿到更高的积分。
上图反映出,把2点的算力投入到第2到问题选集可以得到400的基本积分,把2点的算力分散在第2到问题选集和第1到问题选集上的话,只能得到300的基本积分。

4. 那么根据上面的分析,存在的解题可能性就是全部解决了N道问题选集,部分解决了最多1道问题选集

5. 1<= D <=10
这意味着最多有10道问题选集,我们以全部解决的问题选集的数量为基数,全部解决的问题选集的情况有2的10次方,然后在每一种情况中找剩下的分值最高的问题选集作为部分解决的题的方案。看看解决多少道M里面的题目可以到达目标分数G的要求。
1<= Pi <=100,这意味着最多有2的10次方*100的遍历方法时间上是允许的。

6. 如何遍历2的10次方的情况,选用bit运算

7.遍历所有的情况,存储每一种达到要求的情况所需要的解题数量。然后再从这些解题数量中找出最少的解题数量
AtCoder Context ABC 104 C All Green(绿色全开)_第3张图片

这里参照
AtCoder Context 128 C Swtich(控制开关)

代码

S = input().split(" ")
D = int(S[0])
G = int(S[1])

DATA = []
for i in range(D):
    DATA.append([int(s) for s in input().split(" ")])

def calculate(d, _g, data):
    counts = []
    for i in range(2 ** len(data)):
        arr = []
        bonusIndexes = []
        notBonusIndexes = []
        bonusSum = 0
        bonusCounts = 0
        for j in range(len(data)):
            s = i >> j & 1
            arr.insert(0,s)
            _j = len(data)-1 - j
            if s == 1:
                bonusIndexes.append(_j)
                bonusSum = bonusSum + (_j + 1) * 100 * data[_j][0] + data[_j][1]
                bonusCounts = bonusCounts + data[_j][0]
            else:
                notBonusIndexes.append(_j)

        g = _g

        if bonusSum >= g:
            # 该情况下奖金能满足
            counts.append(bonusCounts)
        else:
            g = g - bonusSum
            # 该情况下,奖金不能满足,还要去找奖金拿不到的情况
            # 只需要考虑目前单价最大的情况
            notBonusMaxIndex = max(notBonusIndexes)
            notBonusMaxIndexNum = data[notBonusMaxIndex][0]
            notBonuxMaxIndexPrice = (notBonusMaxIndex + 1) * 100
            for n in range(1, notBonusMaxIndexNum):
                g = g - notBonuxMaxIndexPrice
                bonusCounts = bonusCounts + 1
                if g <= 0:
                    break

            if g <= 0:
                counts.append(bonusCounts)
            else:
                pass
    return counts


result = calculate(D, G, DATA)

print(min(result))

总结

这一道题要考察到部分解决的情况最多只有一种的这样一个特性
然后发现D最大为10,Pi最大为100的特性
这样可以观察到可以使用遍历的方法
然后遍历取每一种可能性的方法用到了比特运算的方法

※ 另外,我会在我的微信个人订阅号上推出一些文章,欢迎关注
AtCoder Context ABC 104 C All Green(绿色全开)_第4张图片


你可能感兴趣的:(python)