1. 程式人生 > >【Nowcoder 上海五校賽】Wasserstein Distance

【Nowcoder 上海五校賽】Wasserstein Distance

div 前一行 n) 示例 strong 提高 要求 AC tro


題目描述

最近對抗生成網絡(GAN)很火,其中有一種變體WGAN,引入了一種新的距離來提高生成圖片的質量。這個距離就是Wasserstein距離,又名鏟土距離。 這個問題可以描述如下: 有兩堆泥土,每一堆有n個位置,標號從1~n。第一堆泥土的第i個位置有ai克泥土,第二堆泥土的第i個位置有bi克泥土。小埃可以在第一堆泥土中任意移挪動泥土,具體地從第i個位置移動k克泥土到第j個位置,但是會消耗技術分享圖片的體力。小埃的最終目的是通過在第一堆中挪動泥土,使得第一堆泥土最終的形態和第二堆相同,也就是ai=bi (1<=i<=n), 但是要求所花費的體力最小
技術分享圖片技術分享圖片

左圖為第一堆泥土的初始形態,右圖為第二堆泥土的初始形態,顏色代表了一種可行的移動方案,使得第一堆泥土的形態變成第二堆泥土的形態

輸入描述:

輸入測試組數T,每組測試數據,第一行輸入n,1<=n<=100000,緊接著輸入兩行,每行n個整數,前一行為a1, a2,…,an,後一行為b1,b2,…,bn.其中0<=ai,bi<=100000,1<=i<=n,數據保證

技術分享圖片

輸出描述:

對於每組數據,輸出一行,將a土堆的形態變成b土堆的形態所需要花費的最小體力

[示例1]

輸入

2
3
0 0 9
0 2 7
3
1 7 6
6 6 2

輸出

2
9

題解

其實就是一道推公式的題,之前在比賽的時候我們所使用的方法很麻煩,所以在這附上某位大神的做法。

#include<bits/stdc++.h> 
using
namespace std; const int M=1e5+5; int a[M],b[M]; int main() { int n,t,i; cin>>t; while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) scanf("%d",&a[i]); long long s=0,x=0; for(i=1;i<=n;i++) { scanf(
"%d",&b[i]); x+=a[i]-b[i]; if(x>0) s+=x; else s-=x; } printf("%lld\n",s); } return 0; }

【Nowcoder 上海五校賽】Wasserstein Distance