排序
首先,看到这种题如果确定是排序,第一反应就是排序条件:Ei/Ki ,或者Ki/Ei。。。(注意浮点数)
对于两个题i,j;判断这两个题的顺序方式如下:
设两个题之前所有题时间和为 tt;
则 若i 在j 前:score(i)=Ki*(tt+Ei)+Kj*(tt+Ei+Ej);
j 在i 前:score(j)=Kj*(tt+Ej)+Ki*(tt+Ej+Ei);
两式相减得: score(i)-score(j)=Kj*Ei-Ki*Ej;
所以,若想使score(i)<score(j),则有Kj*Ei<Ki*Ej;
因为 Ei>=1,Ki>=1;所以Ei/Ki<Ej/Kj;
ps:ans可能会超int,所以用long long;注意输出long long。
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 6 typedef long long ll; 7 8 const int maxn=100010; 9 10 struct node { 11 int e,k; 12 }p[maxn]; 13 14 bool cmp (node x,node y){ 15 if (x.e*1.0/x.k<y.e*1.0/y.k) 16 return true ; 17 return false ; 18 } 19 20 int main (){ 21 int n; 22 ll t,ans; 23 while (~scanf ("%d",&n)){ 24 for (int i=0;i<n;i++) 25 scanf ("%d",&p[i].e); 26 for (int i=0;i<n;i++) 27 scanf ("%d",&p[i].k); 28 sort (p,p+n,cmp); 29 t=ans=0; 30 for (int i=0;i<n;i++){ 31 t+=p[i].e; 32 ans+=t*p[i].k; 33 }//cout<<p[1].e*1.0/p[1].k<<endl; 34 printf ("%I64d ",ans); 35 } 36 return 0; 37 }