埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 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 }
原文地址:https://www.cnblogs.com/ISGuXing/p/8868067.html