一直wa,就重写,一直超时,就反思了用太多循环,而实际上对一行的数据只有2种处理,一种是这个科目全部补满,还有就是最后需要多少直接补多少,不用一个个模拟循环。
这题参考别人的代码get到了pair的用法。下附上2种,一个是struct,一个则是pair的。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct re{int first,second;};
bool cmp(re a,re b)
{int tem;
if(a.first>b.first){tem=a.second;a.second=b.second;b.second=tem;}
return a.first<b.first;}
int main(void)
{int n,r,avg;
int i;
re le[100090];
while(scanf("%d%d%d",&n,&r,&avg)!=EOF)
{long long need=0;
for(i=1;i<=n;i++)
{scanf("%d%d",&le[i].second,&le[i].first);
need=need+avg-le[i].second;
}
sort(le+1,le+1+n,cmp);
long long s=0,paper=0;
if(need>0)
for(i=1;i<=n;i++)
{long long tem=r-le[i].second;
if((s+tem)<=need){s+=tem;le[i].second=r;paper+=tem*le[i].first;continue;}
else {tem=need-s;paper+=tem*le[i].first;break;
}}
printf("%lld\n",paper);
}
return 0;}
#include
#include
#include
using namespace std;
pair<int,int>le[100090];
int main(void)
{int n,r,avg;
int i;
while(scanf("%d%d%d",&n,&r,&avg)!=EOF)
{long long need=0;
for(i=1;i<=n;i++)
{scanf("%d%d",&le[i].second,&le[i].first);
need=need+avg-le[i].second;
}
sort(le+1,le+1+n);
long long s=0,paper=0;
if(need>0)
for(i=1;i<=n;i++)
{long long tem=r-le[i].second;
if((s+tem)<=need){s+=tem;le[i].second=r;paper+=temle[i].first;continue;}
else {tem=need-s;paper+=temle[i].first;break;
}}
printf("%lld\n",paper);
}
return 0;}