• 考试(()9*


    问题描述

    快毕业了,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

    思路:

      很明显的贪心,把科目按照论文数b排序,从小到大对于某一课计算应该加多少分(写多少论文)。

    出现的错误:

        变量类型搞错了,另外我同桌一分一分的判断(是的,她贪心超时了)。

    #include<iostream>
    #include<queue>
    #include<math.h>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define LL long long
    LL n,r,v;
    struct    node{
        int a,b;
    }s[100009]; 
    LL     tot,ans;
    bool cmp(node A,node B)
    {
        return A.b<B.b; 
    }
    int t; 
    int main()
    {
        freopen("exam.in","r",stdin);freopen("exam.out","w",stdout);
        scanf("%lld%lld%lld",&n,&r,&v);
        tot=1LL*n*v;
        for(int i=1;i<=n;i++)    
            scanf("%d%d",&s[i].a,&s[i].b),tot-=s[i].a;    
        sort(s+1,s+n+1,cmp);
        for(int i=1;i<=n;i++)
        {
            t=r-s[i].a;
            if(t<tot)
                ans+=1LL*t*s[i].b,tot-=t;
            else{
                ans+=1LL*tot*s[i].b;
                cout<<ans;
                return 0;
            }            
        }
        return 0;
    }
  • 相关阅读:
    iOS 界面翻转切换动画
    深度解析Objective-C笔试题
    Objective-C内存管理基础
    Objective-C入门教材
    Objective-C代码学习大纲(6)
    Objective-C代码学习大纲(5)
    Objective-C代码学习大纲(4)
    sharedPreferences
    ListView判断滑动底部
    Oracle 游标疑问
  • 原文地址:https://www.cnblogs.com/CLGYPYJ/p/7245108.html
Copyright © 2020-2023  润新知