您的位置:首页 > 编程语言

[编程题]奖学金

2016-04-18 17:10 183 查看
小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


分析:这道题给的标签是动态规划,其实我觉得没有用到动态规划的思想,勉强算是贪心吧,其实就是照着手工计算的思路写下来就可以了,然而我还是瞎鼓捣了很久。。

拿到这道题我们首先会怎么计算呢,反正都是加一分,当然从需要的时间短的开始加,比如例子中当然从只需要1个小时的开始算,只需要1个小时的课程全部拿到满分了,再算需要5个小时的。代码也是照着这个思路写,也就是先把需要的时长排序,从最小的开始累加,直到现在的总分大于avg*n为止。

中间遇到了几个问题:

1.一开始我是用一个vector保存需要的时间b,排序之后a也得跟着动,这就有点麻烦,想要不用个map。。?其实自己手写一个struct,对结构体内的一个元素进行排序,就解决这个问题了

2.其中几个变量需要用long保存,不然会溢出

代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct les{
int ori;
int time;
};
bool cmp(les a,les b){
return a.time<b.time;
}
int main(){
int n,r,avg;
while(cin>>n>>r>>avg){
long cur=0;
int a,b;
vector<les> t;
for(int i=0;i<n;i++){
les temp;
cin>>temp.ori>>temp.time;
t.push_back(temp);
cur+=temp.ori;
}

long ret=0;
long total=avg*n;
if(cur>=total){
cout<<ret<<endl;
continue;
}
sort(t.begin(),t.end(),cmp); //最后传入的是方法,按结构体中一个元素的升序排列

for(int i=0;i<n;i++){
cur+=(r-t[i].ori);
if(cur>=total){
cur-=(r-t[i].ori);  //这里要把一开始加上去的减掉,一开始没有减回去,答案就总是不对
ret+=(total-cur)*t[i].time;
cout<<ret<<endl;
break;
}
else{
ret+=(r-t[i].ori)*t[i].time;
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: