HU-4882 ZCC Loves Codefires

4349 ワード

http://acm.hdu.edu.cn/showproblem.php?pid=4882                
                     ZCC Loves Codefires
Time Limit:2000/1000 MS(Java/Others)    メモリLimit:32768/32768 K(Java/Others)Total Submission(s):97    Acceepted Submission(s):55
Problem Description
Though ZCC has many Fans、ZCC hiself is a crazy Fan of a coder、caled“Memset 137”。
It was on Codefires(CF)、an online copetive programming site、that ZCC knew Memset 177、and immediate became his fans.
But why
Because Memset 177 can solive all problem in rounds、without unsuccess ful submissions;his estimation of time to sove certain problem is so accurate、that he can surely get an Accent the second he has predited.He son became IGM、the best title of Codefires.Besides、heis fares the mores foruch。
After become IGM、Memset 37 has a new goal:He wants his score in CF rounds to be as large as possible.
What is scoreIn Codefires,everproblem has 2 atributes,let's call them Ki and Bi(Ki,Bi>0).if Memset t 177 solives the proble Ti-th second,he ined Bi-Ki*Ti score.It's Grated.Bi during。
Now that Memset 173 can solive everry proble、in this proble、Bi is ofのconcern.Please write a program to calculate the minimal score he will lose.
 
 
Input
The first line contains an integer N(1≦N≦10^5)、the number of problem in the round.
The second line contains N integers Ei(1≦Ei≦10^4)、the time(second)to solive the i-th proble m.
The last line contains N integers Ki(1≦Ki≦10^4)、as was described.
 
 
Output
One integer L,the minimal score he will lose.
 
 
Sample Input
3
10 10 10 20
1 2 3
 
 
Sample Output
150
ベント
Memset 177 tars the first 10 seconds to solive problem B、then solives problem C at the end of the 30 th second.Memset 37 gets At the end of the 40 th second.L=10*2+(10+20)*3+(10+10)*1=150
 
  分析:
1.x1y1+(x1+x2)*y2->x1*y1+x1*y2+x2*y2
2.x2*y2+(x1+x2)*y1->x1*y1+x2*y1+x2*y2
由此可以看出只要x1*y2<=x2*y1即可,每2项对前后没什么关系。推出一般规则是:aj*ai≤ai*aj。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
struct node
{
    int x,y;
}a[100005];
bool cmp(node b,node c)
{
    return b.x*c.y<=b.y*c.x;
}
int main()
{
     int n,i;
     __int64 ans,cnt;
    while(~scanf("%d",&n))
    {
     for(i=0;i<n;i++)
           scanf("%d",&a[i].x);
     for(i=0;i<n;i++)
           scanf("%d",&a[i].y);
     sort(a,a+n,cmp);
        ans=cnt=0;
     for(i=0;i<n;i++)
     {
         cnt+=a[i].x;
         ans+=cnt*a[i].y;
     }
     printf("%I64d
",ans); } return 0; }