毕业考试

问题描述
快毕业了,Barry希望能通过期末的N门考试来顺利毕业。如果他的N门考试平均分能够达到V分,则他能够成功毕业。现在已知每门的分数不能够超过R;他的第i门考试目前得分为Ai,如果想要在这门科目增加一分则需要多写Bi篇论文。Barry想知道,如果想要毕业的话,他最少需要写多少篇论文?

输入格式(exam.in)
第一行三个整数,N, R, V,分别代表考试科目数,每门考试的最高分,需要达到的平均分。
接下来的N行每行两个整数A, B,分别代表这门考试的目前得分与增加一分需要多写的论文数。

输出格式(exam.out)
一个整数,代表他要毕业最少需要写的论文数。

样例输入
5 5 4
3 1
3 2
5 2
4 7
2 5

样例输出
4

数据范围及约束
对于30%的数据,N<=5, R<=3;
对于100%的数据,N<=100,000, R<=1000,000,000, 1<=V<=R
保证答案不超过10^18.

这是一道贪心模拟题。只要不到限制,就一直先写最便宜的论文。注意要开long long

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cstdio>
#include<queue>
#define LL long long
using namespace std;
LL n,r,v,N,now,ans;
struct H{
    LL b;
    LL a;
}w[100009];
bool cmp(H x,H y){return x.b<y.b;} 
int main()
{
    scanf("%lld%lld%lld",&n,&r,&v);
    for(int i=1;i<=n;i++) scanf("%lld%lld",&w[i].a,&w[i].b),now+=w[i].a;
    sort(w+1,w+n+1,cmp);
    N=n*v;
    int p=0;
    while(N>now)
    {
        p++;
        if(now+r-w[p].a<=N)
             now+=r-w[p].a,ans+=w[p].b*(r-w[p].a);
        else ans+=w[p].b*(N-now),now=N;
    }
    printf("%lld",ans);
    return 0;   
} 
原文地址:https://www.cnblogs.com/dfsac/p/7587883.html