Nowcoder 上海五校赛Wasserstein Distance
Posted kannyi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nowcoder 上海五校赛Wasserstein Distance相关的知识,希望对你有一定的参考价值。
题目描述
最近对抗生成网络(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的主要内容,如果未能解决你的问题,请参考以下文章
埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 B合约数
“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛 A