题目
小v今年有n门课,每门都有考试,为了拿到奖学金,小v必须让自己的平均成绩至少为avg。每门课由平时成绩和考试成绩组成,满分为r。现在他知道每门课的平时成绩为ai ,若想让这门课的考试成绩多拿一分的话,小v要花bi 的时间复习,不复习的话当然就是0分。同时我们显然可以发现复习得再多也不会拿到超过满分的分数。为了拿到奖学金,小v至少要花多少时间复习。
输入描述
输入包含多个测试用例,每个测试用例的第1行为整数n(1<=n<=200),表示课程门数,接下来的n行,每行两个整数,分别表示一门课的平时成绩和b[i],最后一行输入满分r和希望达到的平均成绩avg。输入 n=0 结束
输出描述
每个测试用例输出一行,表示小v要花的最少复习时间。
输入样例
4
80 5
70 2
90 3
60 1
100 92.5
0
输出样例
100
代码
#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;
printf("please input subject num\n");
while ( cin >> n ) {
vector< pair<float, float> > vec ;
float score_cur = 0 ;
long time = 0 ;
printf("please input subject ai and bi\n");
for ( int i = 0; i < n; ++ i ) {
float a, b ;
cin >> a >> b ;
score_cur += a ;
vec.push_back( make_pair( a, b ) ) ;
}
printf("please input subject r and avg\n");
cin >> r >> avg;
int endMark = 0;
while ( cin >> endMark ) {
if (endMark != 0)
continue;
else
break;
}
float target = n * avg ;
printf("basic score is %f\n", score_cur);
printf("total score is %f\n", target);
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 ;
}
}
}
printf("xiao v need learn %ld hour can get the scholarship\n", time);
}
return 0 ;
}
以下为我的微信公众号:技术经理的成长
会不定期进行更新,欢迎关注