题目描述
Snuke lives in another world, where slimes are real creatures and kept by some people. Slimes come in N colors. Those colors are conveniently numbered 1 through N. Snuke currently has no slime. His objective is to have slimes of all the colors together.

Snuke can perform the following two actions:

Select a color i (1≤i≤N), such that he does not currently have a slime in color i, and catch a slime in color i. This action takes him ai seconds.

Cast a spell, which changes the color of all the slimes that he currently has. The color of a slime in color i (1≤i≤N−1) will become color i+1, and the color of a slime in color N will become color 1. This action takes him x seconds.

Find the minimum time that Snuke needs to have slimes in all N colors.

Constraints
2≤N≤2,000
ai are integers.
1≤ai≤109
x is an integer.
1≤x≤109
输入
The input is given from Standard Input in the following format:

N x
a1 a2 … aN
输出
Find the minimum time that Snuke needs to have slimes in all N colors.
样例输入
2 10
1 100
样例输出
12
提示
Snuke can act as follows:

Catch a slime in color 1. This takes 1 second.
Cast the spell. The color of the slime changes: 1 → 2. This takes 10 seconds.
Catch a slime in color 1. This takes 1 second.

题意:给出一段序列,可以由两种操作,1,用序列中某个数值的花费直接买到那个数值,2,将已经获得的一些数值按原序列顺序集体后挪一个值,花费x值。如取到1,1后面是100,x是10,则先取1,再花费10,可以使1变成100。问如何花费最小凑够给出的序列。

首先找到序列中最小值,因为这个最小值可以通过挪动变成序列中任何值,其二,因此后挪操作是已获得序列全体后挪,那么已获得序列的值越多,后挪的数越多,获得的值越多,那么可能通过后挪节省的花费就越多。那么我们首先向,求出一个sum表示若所有值都用直接购买的方式获得,值是多少。这个值即最大花费,然后再用这个值,通过后挪操作看看具体可以减少多少花费。对于两两相邻的值,我得到他有两种方法,一是直接购买,那么花费即两者之和a[i]+a[i+1],第二种是先得到前者,再后挪,即a[i]+a[i]+x,我们需要对比两种获得方式的花费谁更小,那么就是作差,得到a[i+1]-a[i]这个值,因为挪动的花费还有x,也就是说,如果a[i+1]-a[i]小于x,即得到这两个数的花费是可以通过挪动减少的。于是我们从最小值的位置开始,一一做两两的对比。若后者大于前者,表示后者可以通过前者挪动得到,显然我们不希望花费两者中更大的那个值的花费。我们应用较小值得到较大值。那么通过前者得到,我们将较大值变成前者。然后继续比较。

注意的是我们采用的对比顺序是从mini(最小值位置)回头比较,而不是比较其后续。为什么是回头比较而不是向后比较呢?明明题目给出的是后挪操作。因为如果我们向后比较,后面的某个值都是递增的,那么就有可能出现后面连续几个值,都是有当前一个最小值通过后挪得到的,这不要紧,要紧的是是后面第几个值,我们就用当前值后挪了几次,这显然是不妥的,因为我们后挪的操作是对已获得序列的所有值都后挪,而我们这样计算出来的是,放入一个值后挪n次,再放入一个值,再后挪n次,这样的形式明显不符合题意,也不是最优解的操作。
因此我们逆向思考,将当前值看做是之前的值推过来的,这样的更新会有延迟,能保证我一定是经过一次操作后挪得到的,并且这一次操作没有限定是多少个值,我当前值的获得方式可能是由上一个值后挪一次得到,也可能是由上一段值,集体后挪得到。

注意经过刚才这样情况的考虑,我们发现,我们任何时候都可以看做是两个数之间做的操作,即:当前值是由上一个数后挪得到,或者是上一个数之前的几个数同时后挪得到,无论是集体后挪还是单个后挪,我们都看作是两个数之间的后挪关系。

这样对比两数大小并改变值的操作循环执行一圈后,我们记录所有两两数之间的差值之和,记为t,当t大于x时,说明这个差值我们仍可以用x进行优化,为什么是差值之和呢?如果是两数之间的差值我们对x比较可以理解,怎么需要所有差值之和小于x才是最终正解呢?

因为我们之前说过,任何的挪动都可以看做是一段数或一个数的,我们一开始可以看做是当前值和上一个值的挪动,直到最后,我们可以看做是当前值和剩下所有值这段序列后挪得到。也就是说,我们计算的t,把其叫做差值之和,其实是对整个序列的后挪花费进行了计算。这个t仍表示的是前后两数的挪动消费差值。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
int main()
{int n,x,a[2005];while(scanf("%d%d",&n,&x)!=EOF){LL sum=0;///sum求出若所有数都直接取本身的总花费int minn=0x7fffffff,mini;for(int i=0;i<n;i++){scanf("%d",&a[i]);sum+=a[i];if(a[i]<minn)mini=i,minn=a[i];///找到最小值做遍历起点}while(true){LL dis=0;for(int i=0;i<n-1;i++)///多次循环,遍历一圈,当前值大于上一个值说明可以通过挪动优化{if(a[(mini-i+n-1)%n]>a[(mini-i+n-2)%n]){dis+=a[(mini-i+n-1)%n]-a[(mini-i+n-2)%n];///求前后两数差和a[(mini-i+n-1)%n]=a[(mini-i+n-2)%n];///将较大数等于前者较小值,说明该数有上一个值挪动而来}}if(dis<x)break;sum-=dis-x;///因为每次挪动是对整段序列,因此求差值也就是可优化值是对所有两两差值的求和,也就是差值和对比x可优化值,若大于,继续优化}///用总费用直接减去差值和,从中剃去挪动费用printf("%lld\n",sum);}
}
/*
后者花费ai前者花费a(i-1),单独拿来两者花费是ai+a(i-1),
否则是a(i-1)+a(i-1)+x,因为后者比前者大,所以加和必定
大于a(i-1)+a(i-1),那么两者之差就是ai-a(i-1),也就是单独
拿来的花费减去挪动的花费,这个值如果大于x,那么挪动是划
算的,如果小于x说明这里不需要挪动
我不能仅考虑两两之间的差值是否小于x,因为是整体挪动。。
。如果仅是两两差值小于x,求和大于x,必定还可以优化,因为
我明明可以不是单个移动的,而是整体移动的,那么,你更改成
相同值的一些数就可以看做是一段区间,看做一个单独的数,我
其实是在比较当前这个值,和i-1那个区间的所有相等的值、*/

UPC-5594 Colorful Slimes(思维)相关推荐

  1. Colorful Slimes( UPC 5594: 二维dp+思维)

    5594: Colorful Slimes 时间限制: 2 Sec  内存限制: 256 MB 提交: 235  解决: 36 [提交][状态][讨论版][命题人:admin] 题目描述 Snuke ...

  2. 【upc】山路 (ghat) | 思维、最短路

    问题 H: 山路 (ghat) 时间限制: 1 Sec  内存限制: 128 MB 提交 状态 题目描述 会和神奈子一起改变地形,开凿地下洞穴等.虽说是一起,不过看起来改变土地是诹访子的工作.与其说她 ...

  3. [UPC](8840)Medical Checkup ---- 思维

    题目链接 Hint: ICPC 2017 Japan Tsukuba 题意: 有n个同学排成一队,要去体检1,2,3,4,--等等几个体检项目,同学的编号也是1,2,3,-- n 要求:必须要个遵守同 ...

  4. AGC004(A~E)

    前言 FFF不会做,正解好神仙,爬了 正题 AT2041 [AGC004A] Divide a Cuboid https://www.luogu.com.cn/problem/AT2041 题目大意 ...

  5. 计组之中央处理器:5、微程序控制器(组成、原理、概念对比)

    5.微程序控制器 思维导图 微程序控制器的设计思路 微程序控制器的基本结构 微程序控制器的工作原理 概念对比 程序与微程序 指令与微指令 主存储器与控制器存储器 IR和uIR(MDR和CMDR) PC ...

  6. 2021UPC个人训练赛第47场

    个人训练赛第47场 A: 加工零件(最短路) 问题 A: 加工零件时间限制: 1 Sec 内存限制: 128 MB 题目描述 凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神 ...

  7. upc Cafebazaar’s Chess Tournament 思维 + FFT

    说实话,题我没大读懂. 听zwz大佬说这个题挑战者的两个能力值不能与被挑战者能力值相等,不过可以取实数,所以这句话看没看到都不影响这个思路,因为每个相等的数都可以+0.1或-0.1来实现不相等且不影响 ...

  8. upc 潜入苏拉玛 多源bfs + 并查集 + 思维

    潜入苏拉玛 时间限制: 1 Sec 内存限制: 128 MB 题目描述 你接到了⼀个任务,让你潜⼊苏拉玛城,和线⼈取得联络.苏拉玛的地图是⼀张N个点M条边的⽆向图,每个点表⽰苏拉玛城的⼀个路⼜,每条边 ...

  9. 【upc】 跳方格 (lattice) | 差分、思维、dp

    !!! 问题 G: 跳方格 (lattice) 时间限制: 1 Sec  内存限制: 128 MB 提交 状态 题目描述 有一个长长的走廊,巨神 ctt 把它分成m方格,从左到右编号为1,2,..., ...

最新文章

  1. 函数粘合云服务提供端到端解决方案
  2. 《数字短片创作(修订版)》——第一部分 剧本创作 第1章 数字短片创意技法 剧本创作的构思...
  3. 实验管理员掌握的计算机知识,计算机应用基础知识概述试验.DOC
  4. java数据流无法输出验证码
  5. ExtJs学习笔记(2)_Basic GridPanel[基本网格]
  6. 【luogu P2764 最小路径覆盖问题】 模板
  7. 烤仔观察丨和你息息相关!DCEP 能否领跑?各国数字货币都在搞什么?
  8. python的pyc反编译
  9. VGA、DVI、HDMI都是什么意思?
  10. html打印多了空白页,为什么打印Word文档会多打印出一空白页
  11. 数据增强-亮度-对比度-色彩饱和度-色调-锐度 不改变图像大小 --增加ssd目标框xml文件的同步处理方法。
  12. Unity 2D Pixel Perfect 2018新功能文档 自制中文翻译
  13. python微信自动聊天小工具
  14. 简单制作视频画面水平镜像播放特效
  15. 成都中忻嘉业:提高抖音短视频播放量的三个小技巧
  16. 关闭所有杀毒软件快捷方法
  17. 使用随机森林填补缺失值
  18. 企业级项目分享:购物车模块(一)2021-06-08
  19. System.Net.Mail发邮件标题过长出现乱码问题
  20. #python元组(元组的创建和删除)

热门文章

  1. 独家对话AAAI、ACM、ACL三会会士Raymond J. Mooney | 香侬专栏
  2. js监听移动端返回键,从内页返回首页
  3. SSMS错误代码大全
  4. XTU 程序设计实践模拟考试题1
  5. 感谢有你!Apache DolphinScheduler 项目 GitHub star 突破 8k
  6. 创作者基金 11 月亮点
  7. 什么是JSONP协议 及对JSONP的改进
  8. 清华同方主机装系统过程中进不去bios
  9. 巴西龟饲养日志----八月底巴西龟状况
  10. xshell6 评估期已过 解决办法