题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4442
题意:去体检,求做完所有检查所花费的最小时间模上一个数
花费的时间规则如下
有n项活动,每项活动有两个数字 a b
a代表现在去排队所花费的时间 b代表每一秒该活动需要等待的时间是多b秒
举个简单的例子
2
1 3 第一项活动1秒,执行完第一项活动之后执行第二项
1 9 由于先执行的第一项活动,执行第二项活动时所需的时间就变成了10秒
题目分类:贪心
题目分析:因为当执行当前任务时,b是乘以现在所需要的时间,a是直接相加的,刚开始时想的是b的权重比较大,所以,按照b从大到小的排序,a不用管,后来细细想想,其实是有漏洞的,如果b比较小,而a特别大的时候,顺序就是不对的。
代码:
#include<bits/stdc++.h> using namespace std; #define LL __int64 #define MOD 31536000 struct P { LL a,b; }num[100009]; //bj*ai<=aj*bi LL cmp(P X,P Y) { return X.a*Y.b<Y.a*X.b; } int main() { //freopen("in.txt","r",stdin); int n; while(scanf("%d",&n)&&n) { for(int i=1;i<=n;i++) { cin>>num[i].a>>num[i].b; } sort(num+1,num+n+1,cmp); /*for(int i=1;i<=n;i++) { cout<<num[i].a<<" "<<num[i].b<<endl; }*/ int ans=0; for(int i=1;i<=n;i++) { ans=(ans+ans*num[i].b+num[i].a)%MOD; } cout<<ans<<endl; } return 0; }