埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 Wasserstein Distance

题目链接:https://www.nowcoder.com/acm/contest/91/A

思路:贪心(写复杂了)

数据弱,还可以直接暴力

 1 #include<iostream>
 2 #include<string>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<string.h>
 6 #include<stdio.h>
 7 #include<queue>
 8 using namespace std;
 9 int a[100500];
10 int b[100500];
11 struct Node{
12     int num;
13     int value;
14     bool operator < (const Node &a) const {
15         return num>a.num;//最小值优先
16     }
17 };
18 int main(){
19     int T;
20     cin>>T;
21     while(T--){
22         memset(a,0,sizeof(a));
23         memset(b,0,sizeof(b));
24         int n;
25         cin>>n;
26         for(int i=0;i<n;i++){
27             scanf("%d",a+i);
28         }
29         for(int i=0;i<n;i++){
30             scanf("%d",b+i);
31         }
32         priority_queue< Node > q1,q2;
33         for(int i=0;i<n;i++){
34             Node tmp;
35             int value=a[i]-b[i];
36             tmp.num=i;
37             tmp.value=value;
38             if(value==0){
39                 continue;
40             }else if(value<0){
41                 q1.push(tmp);
42             }else{
43                 q2.push(tmp);
44             }
45         }
46         long long  ans=0;
47         while(!q2.empty()){
48             Node tmp1=q1.top();
49             Node tmp2=q2.top();
50             int x,y;
51             x=tmp1.value;
52             y=tmp2.value;
53             if(x+y==0){
54                 ans+=y*abs(tmp1.num-tmp2.num);
55                 q1.pop();
56                 q2.pop();
57             }else if(x+y<0){
58                 ans+=y*abs(tmp1.num-tmp2.num);
59                 q1.pop();
60                 q2.pop();
61                 tmp1.value=x+y;
62                 q1.push(tmp1);
63             }else{
64                 ans+=(-x)*abs(tmp1.num-tmp2.num);
65                 q1.pop();
66                 q2.pop();
67                 tmp2.value=x+y;
68                 q2.push(tmp2);
69             }
70         }
71         cout<<ans<<endl;
72     }
73     return 0;
74 }
 1 /*暴力*/
 2 #include<iostream>
 3 #include<bits/stdc++.h>
 4 using namespace std;
 5 long long a[100500];
 6 long long b[100500];
 7 int main(){
 8     long long T;
 9     cin>>T;
10     while(T--){
11         long long n;
12         cin>>n;
13         long long cnt=0;
14         for(long long i=0;i<n;i++){
15             scanf("%lld",a+i);
16         }
17         for(long long i=0;i<n;i++){
18             scanf("%lld",b+i);
19         }
20         for(long long i=0;i<n;i++){
21             if(a[i]==b[i]){
22                 continue;
23             }
24             else if(a[i]<b[i]){
25                 for(long long j=i;j<n;j++){
26                     if(a[i]==b[i]){
27                         break;
28                     }
29                     if(a[j]>b[j]){
30                         long long value=a[j]-b[j];
31                         if(value==b[i]-a[i]){
32                             cnt+=value*abs(i-j);
33                             a[i]=b[i];
34                             a[j]=b[j];
35                         }else if(value > b[i]-a[i]){
36                             cnt+=(b[i]-a[i])*abs(i-j);
37                             a[j]=a[j]-(b[i]-a[i]);
38                             a[i]=b[i];
39                         }else{
40                             cnt+=value*abs(i-j);
41                             a[i]=a[i]+value;
42                             a[j]=b[j];
43                         }
44                     }
45                 }
46             }else{
47                 for(long long j=i;j<n;j++){
48                     if(a[i]==b[i]){
49                         break;
50                     }
51                     if(a[j]<b[j]){
52                         long long value=b[j]-a[j];
53                         if(value>a[i]-b[i]){
54                             cnt+=(a[i]-b[i])*abs(i-j);
55                             a[j]=a[j]+(a[i]-b[i]);
56                             a[i]=b[i];
57                         }else if(value<a[i]-b[i]){
58                             cnt+=value*abs(i-j);
59                             a[j]=b[j];
60                             a[i]=a[i]-value;
61                         }else{
62                             cnt+=value*abs(i-j);
63                             a[j]=b[j];
64                             a[i]=b[i];
65                         }
66                     }
67                 }
68             }
69         }
70         cout<<cnt<<endl;
71     }
72     return 0;
73 }

 

posted @ 2018-04-17 17:15  ISGuXing  阅读(197)  评论(0编辑  收藏  举报