小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
#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;
}