題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4442
2012 Asia JinHua Regional Contest A題
要求最少所用的時間,貪心的思想,可以推一下。
設a1,b1,a2,b2。
如果a1排在a2之前完成,則必滿足a1+a1*b2+a2<a2+b1*a2+a1,之後便可得到關係式a1*b2<b1*a2,只要按照a1/b1<a2/b2的順序排序即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct point
{
long long x,y;
double z;
};
point a[100005];
bool cmp(const point a,const point b)
{
return a.z<b.z;
}
int main()
{
int n;
while(cin>>n)
{
if(n==0) break;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
double xx=a[i].x,yy=a[i].y;
a[i].z=xx/yy;
}
sort(a+1,a+1+n,cmp);
long long sum=0;
long long tmp=0;
for(int i=1;i<=n-1;i++)
{
sum+=a[i].x;
tmp+=a[i].x;
tmp=tmp%31536000;
a[i+1].x+=tmp*a[i+1].y;
a[i+1].x=a[i+1].x%31536000;
sum=sum%31536000;
}
sum+=a[n].x;
cout<<sum%31536000<<endl;
}
}