1. 程式人生 > >埃森哲杯第十六屆上海大學程式設計聯賽春季賽暨上海高校金馬五校賽 A

埃森哲杯第十六屆上海大學程式設計聯賽春季賽暨上海高校金馬五校賽 A

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 131072K,其他語言262144K
64bit IO Format: %lld
題目描述
最近對抗生成網路(GAN)很火,其中有一種變體WGAN,引入了一種新的距離來提高生成圖片的質量。這個距離就是Wasserstein距離,又名剷土距離。
這個問題可以描述如下:

有兩堆泥土,每一堆有n個位置,標號從1~n。第一堆泥土的第i個位置有ai克泥土,第二堆泥土的第i個位置有bi克泥土。小埃可以在第一堆泥土中任意移挪動泥土,具體地從第i個位置移動k克泥土到第j個位置,但是會消耗k*|i-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
備註:
輸入資料量較大,建議使用scanf/printf

水題

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
const int maxn=1e5+50;
ll a[maxn],b[maxn];
ll getans=0;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        getans=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf
("%lld",&a[i]); } for(int i=1;i<=n;i++) { scanf("%lld",&b[i]); } ll now=0; for(int i=1;i<=n;i++) { now+=a[i]-b[i]; getans+=abs(now); } printf("%lld\n",getans); } return 0; }