题意:给出一些队伍,每个队伍有初始等待时间和每秒增加的时间,求最短时间
假设有两个队初始时间和每秒增加时间为a1,b1和a2,b2
若第选择第一个的时间小于第二个,则
a1+a2+a1*b2<a2+a1+a2*b1
化简得a1*b2<a2*b1,注意不要除过去,否则会有除以零报错
卧槽,MOD写错了,wa了半天
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD (365*60*60*24) 10 const double eps=1e-5; 11 #define cl(a) memset(a,0,sizeof(a)) 12 #define ts printf("*****\n"); 13 const int MAXN=100015; 14 int n,m,tt; 15 struct node 16 { 17 int s,v; 18 void in() 19 { 20 scanf("%d%d",&s,&v); 21 } 22 }A[MAXN]; 23 bool cmp(node a,node b) 24 { 25 return (long long)a.s*b.v<(long long)b.s*a.v; 26 } 27 int main() 28 { 29 int i,j,k; 30 #ifndef ONLINE_JUDGE 31 freopen("1.in","r",stdin); 32 #endif 33 while(scanf("%d",&n)!=EOF) 34 { 35 if(n==0) break; 36 for(i=0;i<n;i++) A[i].in(); 37 sort(A,A+n,cmp); 38 long long sum=0; 39 long long t=0; 40 for(i=0;i<n;i++) 41 { 42 sum+=(A[i].s+t*A[i].v)%MOD; 43 sum%=MOD; 44 t+=(A[i].s+t*A[i].v)%MOD; 45 t%=MOD; 46 } 47 printf("%I64d\n",sum); 48 } 49 }
时间: 2024-10-30 17:45:19