C - RJ702奖学金问题

**

东北师范大学算法课在线练习 地址nenuoj

**
C - RJ702奖学金问题

Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)

Problem Description

小v今年有n门课(课程编号为0~n-1),每门课程都有考试,为了拿到奖学金,小v必须让自己所有课程的平均成绩至少为avg。每门课由平时成绩和考核成绩相加得到,满分为r。现在他知道每门课的平时成绩为ai(0<=i<=n-1),若想让这门课的考试成绩多拿1分,小v要花bi的时间复习,如果不复习,当然就是0分。同时,显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习?

Input

输入包含多个测试用例。每个测试用例的第1行为整数n(1<=n<=200),表示课程门数,接下来的n行,每行两个整数,分别表示一门课的平时成绩和bi,最后一行输入满分r和希望达到的平均成绩avg。以输入n=0结束。

Output

每个测试用例输出一行,表示小v要花的最少复习时间。

Sample Input

4
80 5
70 2
90 3
60 1
100 92.5
0

Sample Output

30

思想 :贪心和覆盖用了stl的pair容器。做题查题解转别人的代码,我吼烦,好没面子

#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>

using namespace::std;

bool cmp( pair<float, float> first, pair<float, float> next ) {
    return first.second < next.second ;
}

int main() {
    int n;
    float r, avg;
    while ( cin >> n ) {
        vector< pair<float, float> > vec ;
        float score_cur = 0 ;
        long time = 0 ;

        for ( int i = 0; i < n; ++ i ) {
            float a, b ;
            cin >> a >> b ;
            score_cur += a ;
            vec.push_back( make_pair( a, b ) ) ;
        }
        cin >> r >> avg;

        int endMark = 0;
        while ( cin >> endMark ) {
            if (endMark != 0)
                continue;
            else
                break;
        }

        float target = n * avg ;


        if ( target <= score_cur ) {
            time = 0 ;
        }
        else {
            stable_sort( vec.begin(), vec.end(), cmp ) ;
            for ( int i = 0; i < n; ++ i ) {
                score_cur += ( r - vec[i].first ) ;
                if ( score_cur >= target ) {
                    score_cur -= ( r - vec[i].first ) ;
                    time += ( target - score_cur ) * vec[i].second ;
                    break ;
                }
                else {
                    time += ( r - vec[i].first ) * vec[i].second ;
                }
            }
        }
       cout<<time;
    }
    return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值