【Nowcoder 上海五校赛】Wasserstein Distance
程序员文章站
2022-03-25 22:25:38
题目描述 最近对抗生成网络(GAN)很火,其中有一种变体WGAN,引入了一种新的距离来提高生成图片的质量。这个距离就是Wasserstein距离,又名铲土距离。 这个问题可以描述如下: 有两堆泥土,每一堆有n个位置,标号从1~n。第一堆泥土的第i个位置有ai克泥土,第二堆泥土的第i个位置有bi克泥土 ......
题目描述
最近对抗生成网络(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; }