链接: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土堆的形态所需要花费的最小体力

输入例子:
2
3
0 0 9
0 2 7
3
1 7 6
6 6 2
输出例子:
2
9

-->

示例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+; int a[maxn],b[maxn];
int main()
{
int T;
//cin>>T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=;i<=n;i++)
scanf("%d",&b[i]);
long long ans=;
for(int i=;i<n;i++)
{
ans += abs(a[i]-b[i]);//每次分配 答案+abs(a[i]-b[i])
a[i+] += a[i]-b[i];//a[i]-b[i]计算还差多少,后面的补上来,将该摞多余的土堆数放到下一摞
}
printf("%lld\n",ans);
}
return ;
}

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

A Wasserstein Distance[贪心/模拟]的更多相关文章

  1. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

  2. 贪心+模拟 ZOJ 3829 Known Notation

    题目传送门 /* 题意:一串字符串,问要最少操作数使得成为合法的后缀表达式 贪心+模拟:数字个数 >= *个数+1 所以若数字少了先补上在前面,然后把不合法的*和最后的数字交换,记录次数 岛娘的 ...

  3. CodeForces ---596B--Wilbur and Array(贪心模拟)

    Wilbur and Array Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Su ...

  4. UVA 10714 Ants 蚂蚁 贪心+模拟 水题

    题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间. 模拟一下,发现其实灰常水的贪心... 不能直接求最大和最小的= =.只要求出每只蚂蚁都走长路 ...

  5. CodeForces 797C Minimal string:贪心+模拟

    题目链接:http://codeforces.com/problemset/problem/797/C 题意: 给你一个非空字符串s,空字符串t和u.有两种操作:(1)把s的首字符取出并添加到t的末尾 ...

  6. CodeForces - 730A 贪心+模拟

    贪心策略: 1.只有一个最大值,选着第二大的一起参加比赛减分. 2.有奇数个最大值,选择三个进行比赛. 3.偶数个最大值,选择两个进行比赛. 为什么不把最大值全部选择? 因为最多只能选五个,有可能选择 ...

  7. (贪心 模拟?) codeVs1098 均分纸牌

    题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸 ...

  8. UVA 11776 - Oh Your Royal Greediness! - [贪心/模拟]

    题目链接:https://cn.vjudge.net/problem/UVA-11776 题意: 给出数字n(0<=n<=1000),代表有n个农民,接下来有n行,每行两个数字S和E代表这 ...

  9. Population Size CodeForces - 416D (贪心,模拟)

    大意: 给定$n$元素序列$a$, 求将$a$划分为连续的等差数列, 且划分数尽量小. $a$中的$-1$表示可以替换为任意正整数, 等差数列中必须也都是正整数. 贪心策略就是从前到后尽量添进一个等差 ...

随机推荐

  1. 文件的特殊权限(SUID,SGID,SBIT)

    文件的一般权限:r w x  对应 421  文件的特殊权限:SUID SGID SBIT对应 421  文件的隐藏权限:chattr设置隐藏权限,lsattr查看文件的隐藏权限. 文件访问控制列表: ...

  2. java集群技术

    序言 越来越多的关键应用运行在J2EE(Java 2, Enterprise Edition)中,这些诸如银行系统和账单处理系统需要高的可用性(High Availability, HA),同时像Go ...

  3. cakephp中使用 find('count')方法

    对于find('count',array('group'=>'user_id')); Model.php中这样描述: /** * Handles the before/after filter ...

  4. SQL语句Not IN优化方案

    总结网友们在CSDN社区上对于not in的优化策略,整理如下,备查.    select * from emp where emp_no not in (select emp_no from emp ...

  5. python-生成器迭代器及递归调用

    生成器是一个可迭代的对象,它的执行会记住上一次返回时在函数体中的位置.对生成器第二次(或第 n 次)调用跳转至该函数上次执行位置继续往下执行,而上次调用的所有局部变量都保持不变. 生成器的特点:1.生 ...

  6. 【转载】主成分分析法(PCA)

    https://www.jisilu.cn/question/252942 进行维数约减(Dimensionality Reduction),目前最常用的算法是主成分分析法 (Principal Co ...

  7. django orm 基本Field介绍

    ORM:object relational mapping,对象关系映射 django中使用原生sql的弊端: 1.SQL语句重复率很高,利用率不高 2.如果业务逻辑生变,原生SQL更改起来比较多 3 ...

  8. c++ 运算符重载operator

    一般格式为: 函数类型 operator 运算符名称(形参列表){ 对运算符的重载 } 注意函数名是由operator和运算符组成.在上面的一般格式中,operator是关键字,是专门用于重载运算符函 ...

  9. cookie和session机制区别

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  10. redis学习(六)主从复制

    主从复制:主机更新数据后,根据配置和策略,自动同步到备机的master/slaver机制,master以写为主,slaver以读为主.redis支持主从复制. 下面通过实例来讲解主从复制的四个模式: ...