AtCoder Beginner Contest 104 C题题解

C - All Green

题目

Problem Statement

A programming competition site AtCode provides algorithmic problems. Each problem is allocated a score based on its difficulty. Currently, for each integer i between 1 and D (inclusive), there are *p**i* problems with a score of 100i points. These p1+…+*p**D* problems are all of the problems available on AtCode.

A user of AtCode has a value called total score. The total score of a user is the sum of the following two elements:

  • Base score: the sum of the scores of all problems solved by the user.
  • Perfect bonuses: when a user solves all problems with a score of 100i points, he/she earns the perfect bonus of *c**i* points, aside from the base score (1≤iD).

Takahashi, who is the new user of AtCode, has not solved any problem. His objective is to have a total score of G or more points. At least how many problems does he need to solve for this objective?

Constraints

  • 1≤D≤10
  • 1≤*p**i*≤100
  • 100≤*c**i*≤106
  • 100≤G
  • All values in input are integers.
  • *c**i* and G are all multiples of 100.
  • It is possible to have a total score of G or more points.

Input

Input is given from Standard Input in the following format:

D G
p1 c1
:
pD cD

Output

Print the minimum number of problems that needs to be solved in order to have a total score of G or more points. Note that this objective is always achievable (see Constraints).

Sample Input 1

2 700
3 500
5 800

Sample Output 1

3

In this case, there are three problems each with 100 points and five problems each with 200 points. The perfect bonus for solving all the 100-point problems is 500points, and the perfect bonus for solving all the 200-point problems is 800 points. Takahashi's objective is to have a total score of 700 points or more.
One way to achieve this objective is to solve four 200-point problems and earn a base score of 800 points. However, if we solve three 100-point problems, we can earn the perfect bonus of 500 points in addition to the base score of 300 points, for a total score of 800 points, and we can achieve the objective with fewer problems.

题意

给出D组题目,每组题目有pi道,解决一道题目的得分为100*i,如果解决完一组题目,可以获得ci分的加分。求分数达到G的最少需要的题目数

思路

组数D一定小于10,思路上来陷入了僵局。我最开始考虑的时候,认为需要考虑不同题目做出来不定数目的情况,这样不具备有可靠地转移性质了,因此,一直被卡。

然而,其实,我们可以枚举是否做完该组题目的情况,不超过2^10种,记录每次做完题目并且得到奖励分数后的总分。然后记录当前剩余题目能否达到需要的剩下分数,每次循环更新题目最小值。

代码

#pragma comment(linker, “/STACK:1024000000,1024000000”)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;

#define REP(i,n) for(int i=0;i<(n);i++)

const int MAXN = 1e2+10;
ll D,G,p[MAXN],c[MAXN];

int main(){
    scanf("%lld %lld",&D,&G);
    for(int i=0;i<D;i++){
        scanf("%lld %lld",&p[i],&c[i]);
    }
    ll ans = INF;
    for(int mask =0;mask<(1<<D);mask++){
        ll s = 0,num = 0,rest_max = -1;
        for(int i=0;i<D;i++){
            if(mask >> i & 1){
                s += 100 * (i+1) * p[i] + c[i];
                num += p[i];
            }else{
                rest_max = i;
            }
        }
        if(s < G){
            int s1 = 100 * (rest_max + 1);
            int need = (G - s + s1 - 1) / s1;
            if(need >= p[rest_max]){
                continue;
            }
            num += need;
        }
        ans = min(ans, num);
    }
    printf("%lld\n",ans);
    
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/caomingpei/p/9433626.html