博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TC SRM683 Div1 250
阅读量:5116 次
发布时间:2019-06-13

本文共 637 字,大约阅读时间需要 2 分钟。

大意是有一排石子,每一堆有a[i]个,目标状态每一堆有b[i]个,每一步可以从一堆中取出一个石子转移到相邻的一个,其中1和n也算相邻也即环形。问最少步数。

比赛的时候写了个按照步数贪心的做法,FST了,当时想的贪心是从1到n/2枚举步数,for每一个需要石子的堆i,从(i+d)%n与(i-d)%n中看是否可以转移。

比赛结束自己想到一个反例

1 0 1 0 0 

0 1 0 1 0

答案应当是2,但是我那个贪心结果会成3。

后来看了下别人做法,大致有2种,一种是最优解中会存在某些点,这些点不会有穿越他们的MOVE,所以可以枚举每个点作为开始,将环形转为线性。

答案是每个a与b的前缀和之差的和。

 

还有一种做法是做一个c[i]=a[i]-b[i]的数组,sort之后,取中位数作为target。答案是所有值与中位数之差的和。

下面贴第一种解法的代码

1 class MoveStones 2 { 3 public: 4     long long get(vector 
a, vector
b) { 5 long long s1=0,s2=0; 6 int n=a.size(); 7 for (int i=0;i
View Code

 

转载于:https://www.cnblogs.com/micrari/p/5229344.html

你可能感兴趣的文章
使用cURL操作Openstack对象存储的ReST API
查看>>
HTML基础知识点
查看>>
浏览器缓存
查看>>
利用conda安装git
查看>>
java http get和post请求
查看>>
Linux之磁盘挂载
查看>>
Android菜鸟成长记1--环境的搭配和第一个项目的构建
查看>>
tar用法(转)
查看>>
leetcode 18 4Sum
查看>>
7-1 抓老鼠啊~亏了还是赚了? (20 分)
查看>>
P2947 [USACO09MAR]向右看齐Look Up
查看>>
记录这个伟大的日子
查看>>
EasyUi-1 拖放
查看>>
莫比乌斯反演学习笔记
查看>>
OpenSceneGraph FAQ
查看>>
Java开发环境的配置
查看>>
Dijkstra算法——最短路径(转)
查看>>
《python可以这样学》第一章
查看>>
Andirod——网络连接(HttpURLConnection)
查看>>
oc27--synthesize,省略getset实现
查看>>