zoukankan      html  css  js  c++  java
  • A Wasserstein Distance[贪心/模拟]

    链接:https://www.nowcoder.com/acm/contest/91/A
    来源:牛客网

    最近对抗生成网络(GAN)很火,其中有一种变体WGAN,引入了一种新的距离来提高生成图片的质量。这个距离就是Wasserstein距离,又名铲土距离。
    这个问题可以描述如下:


    有两堆泥土,每一堆有n个位置,标号从1~n。第一堆泥土的第i个位置有ai克泥土,第二堆泥土的第i个位置有bi克泥土。小埃可以在第一堆泥土中任意移挪动泥土,具体地从第i个位置移动k克泥土到第j个位置,但是会消耗的体力。小埃的最终目的是通过在第一堆中挪动泥土,使得第一堆泥土最终的形态和第二堆相同,也就是ai=bi (1<=i<=n), 但是要求所花费的体力最小

    左图为第一堆泥土的初始形态,右图为第二堆泥土的初始形态,颜色代表了一种可行的移动方案,使得第一堆泥土的形态变成第二堆泥土的形态


    输入描述:

    输入测试组数T,每组测试数据,第一行输入n,1<=n<=100000,紧接着输入两行,每行n个整数,
    
    

    输出描述:

    对于每组数据,输出一行,将a土堆的形态变成b土堆的形态所需要花费的最小体力

    示例1

    输入

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

    输出

    2
    9

    备注:

    输入数据量较大,建议使用scanf/printf

    【分析】:想要代价最小,控制k*|i-j|最小的办法是只移动相邻的。那么只要保证k最小并且从左到右累加k(k必定为正数,因为k>0&&|i-j|>0,故abs( a[i]-b[i] )。

    首先这里有一个简化的思想。考虑到分好后所有的土堆数都等于bi,我们干脆以bi作为标准,让所有的ai减去bi,如果是正数表明需要移走这个正数数量的土堆,注意负数需要移走的土堆数就是这个负数本身,下文中把处理过的牌组就叫做简化后的土堆。

    .可能会疑问那个差值可能是正可能是负(其实+/-可以看成移动的方向),这没有关系,差值为正表示 i 移到 i+1,为负表示从 i+1 移到 i,其答案数都是加abs( a[i]-b[i] ),所以可以等价。

    贪心思想则是从左到右依次枚举,将每个土堆上简化后的数移动到右边的土堆(再说一遍,是负数的就移走负数),这样最后一组牌就自动变成bi了

    但是如果简化后的土堆中有bi怎么办?第一个不为bi的土堆之前所有的土堆都不需要进行移动,否则步数偏大。但是在土堆中如果有bi,那没有关系,因为他左边的土堆一定会往他上面移动一定数量的土堆。

     【代码】:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+100;
    
    int a[maxn],b[maxn];
    int main()
    {
        int T;
        //cin>>T;
        scanf("%d",&T);
        while(T--)
        {
            int n;
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]);
            for(int i=1;i<=n;i++)
                scanf("%d",&b[i]);
            long long ans=0;
            for(int i=1;i<n;i++)
            {
               ans += abs(a[i]-b[i]);//每次分配 答案+abs(a[i]-b[i])
               a[i+1] += a[i]-b[i];//a[i]-b[i]计算还差多少,后面的补上来,将该摞多余的土堆数放到下一摞
            }
            printf("%lld
    ",ans);
        }
        return 0;
    }

     【总结】:贪心选择性:全局最优解是由局部最优解产生。贪心法比较容易实现,但是不好证明。移动负数个土堆也是不违反题意的,因为那相当于逆向移动了正数个土堆。问题的规模被一步步地缩小。

  • 相关阅读:
    AGC037F Counting of Subarrays
    AGC025F Addition and Andition
    CF506C Mr. Kitayuta vs. Bamboos
    AGC032D Rotation Sort
    ARC101F Robots and Exits
    AGC032E Modulo Pairing
    CF559E Gerald and Path
    CF685C Optimal Point
    聊聊Mysql索引和redis跳表
    什么是线程安全
  • 原文地址:https://www.cnblogs.com/Roni-i/p/8848999.html
Copyright © 2011-2022 走看看