奖学金

来源:互联网 发布:诸神黄昏神羽进阶数据 编辑:程序博客网 时间:2024/04/30 11:23

题目描述

小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 90 59 18 10 19 100

输出例子:

43

一、原始想法:

解题思路:因为要求最小复习时间,故应将每科按复习时间按递增的顺序排列,然后每长一分求得平均值后再与要求的平均值进行比较,直到达到要求(这是自己一开始的思路,缺点每次要求平均值,而且是长一分判断一次,这要效率相对较低)注意时间应设置为long 否则不够用 代码如下

#include<iostream>#include <vector>#include<string>#include <algorithm>using namespace std;class score{public:int sc;int cost;};bool cmp(const score a,const score b){return a.cost < b.cost;}int avge(vector<score>a ){int avge = 0;for (int i = 0; i < a.size(); i++)avge += a[i].sc;return avge/a.size();}int main(){int n, r, avg;while (cin>>n>>r>>avg){score* p = new score[n];vector<score> v;for (int i = 0; i < n; i++){cin >> p[i].sc >> p[i].cost;v.push_back(p[i]);}sort(v.begin(),v.end(),cmp);long  mintime = 0;int curavg = avge(v);for (int i = 0; i < n; i++){while (curavg < avg&&v[i].sc < r){mintime += v[i].cost;v[i].sc++;curavg = avge(v);}if (curavg>= avg)break;}cout << mintime << endl;;}return 0;}

二、先求的总分然后与需要的总分进行比较,这样可以避免每次求平均值;再者每次不采用每长一分比较一次的方法,而是是先将每科修成满分时的分差加上,如果当前课程满分后不能获得奖学金 复习至满分,累加复习时间,然后复习下一门
否者    当前课程满分后能获得奖学金  所需时间 += (所需总分 - 当前分数)*在该课程上获得1分所需时间  输出时间;
退出循环。

#include<iostream>#include <vector>#include<string>#include <algorithm>using namespace std;class score{public:int sc;int cost;};bool cmp(const score a,const score b){return a.cost < b.cost;}int main(){int n, r, avg;while (cin>>n>>r>>avg){int target = n*avg;vector<score> v;int sum = 0;score temp;for (int i = 0; i < n; i++){cin >> temp.sc >> temp.cost;sum += temp.sc;v.push_back(temp);}long mintime = 0;if (sum >= target)cout <<0<< endl;else{sort(v.begin(), v.end(), cmp);for (int i = 0; i < v.size(); i++){sum += (r - v[i].sc);if (sum >= target){sum -= (r-v[i].sc);mintime += (target-sum)*v[i].cost;cout << mintime << endl;break;}else{mintime += (r - v[i].sc)*v[i].cost;}}}}return 0;}


0 0
原创粉丝点击