奖学金--动态规划--网易2016研发工程师编程题

[编程题] 奖学金
小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。

输入描述:
第一行三个整数n,r,avg(n大于等于1小于等于1e5,r大于等于1小于等于1e9,avg大于等于1小于等于1e6),接下来n行,每行两个整数ai和bi,均小于等于1e6大于等于1


输出描述:
一行输出答案。

输入例子:
5 10 9
0 5
9 1
8 1
0 1
9 100

输出例子:
43
/*(c/c++)
只需满足平均成绩大于等于avg即可,不管单科成绩。
所以先从花时间最少的课开始复习,使其满分。
伪码:
if(当前成绩 >= avg*n)
    cout << 0 << endl;
else{
    sort(时间花费);
    for(时间花费从小到大)
         if 当前课程满分后不能获得奖学金
             复习至满分,累加复习时间,然后复习下一门
        else if 当前课程满分后能获得奖学金
            所需时间 += (所需总分 - 当前分数)*在该课程上获得1分所需时间
            输出时间;
            退出循环。
}
*/


#include "stdafx.h"
#include <vector>
#include <iostream>
#include <algorithm>

using namespace::std;

struct score_hour {
	int score;
	int hour;
};

static bool cmp(score_hour s1, score_hour s2) {
	return s1.hour < s2.hour;
}

int main() {
	int n, r, avg;

	while (cin >> n >> r >> avg) {
		vector<score_hour> vec;
		score_hour tmp;

		for (int i = 0; i < n; ++i) {
			cin >> tmp.score >> tmp.hour;
			vec.push_back(tmp);
		}

		int target = n * avg;
		int score_cur = 0;
		long time = 0;

		for (int i = 0; i < vec.size(); ++i) {
			score_cur += vec[i].score;
		}

		if (score_cur >= target) {
			cout << 0 << endl;
		}
		else {
			std::stable_sort(vec.begin(), vec.end(), cmp);
			for (int i = 0; i < vec.size(); ++i) {
				score_cur += (r - vec[i].score);
				if (score_cur >= target) {
					score_cur -= (r - vec[i].score);
					time += (target - score_cur) * vec[i].hour;
					cout << time << endl;
					break;
				}
				else {
					time += (r - vec[i].score) * vec[i].hour;
				}
			}
		}
	}
	return 0;
}


第二次做:

坑爹啊,time 要 设置为 long 型才够!

#include <iostream>
#include <vector>
#include <algorithm>

using namespace::std ;

struct score_hour {
    int score ;
    int hour ;
} ;

bool cmp( score_hour first, score_hour next ) {
    return first.hour < next.hour ;
}

int main() {
    int n, r, avg ;
    
    while ( cin >> n >> r >> avg ) {
        vector<score_hour> vec ;
        for ( int i = 0; i < n; ++ i ) {
            score_hour tmp ;
            cin >> tmp.score >> tmp.hour ;
            vec.push_back( tmp ) ;
        }
        
        int score_cur = 0 ;
        int target = n * avg ;
        long time = 0 ;
        
        for ( int i = 0; i < n; ++ i ) {
            score_cur += vec[i].score ;
        }
        
        if ( score_cur >= target ) {
            cout << 0 << endl ;
        } else {
            stable_sort( vec.begin(), vec.end(), cmp ) ;
            for ( int i = 0; i < n; ++ i ) {
                score_cur += ( r - vec[i].score ) ;
                if ( score_cur >= target ) {
                    score_cur -= ( r - vec[i].score ) ;
                    time += ( target - score_cur ) * vec[i].hour ;
                    cout << time << endl ;
                    break ;
                } else {
                    time += ( r - vec[i].score ) * vec[i].hour ;
                }
            }
        }
    }
    
    return 0 ;
}


第三次做,注意,time 要设置为 long 型

#include <iostream>
#include <vector>
#include <algorithm>

using namespace::std ;

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

int main() {
    int n, r, avg ;
    
    while ( cin >> n >> r >> avg ) {        
        vector<pair<int, int>> vec ;
        int score_cur = 0 ;
        long time = 0 ;
        for ( int i = 0; i < n; ++ i ) {
            int a, b ;
            cin >> a >> b ;
            score_cur += a ;
            vec.push_back( make_pair( a, b ) ) ;
        }
        
        int 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 << endl ;
    }
    
    return 0 ;
}


展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读