Wannafly挑战赛7 B - codeJan与旅行
题目描述
codeJan 想要游览 m 个城市,同时因为时间是不断变化的,游览一个城市多次也是允许的,但是不能永远待在一个城市,否则那样太无聊了。给出这些城市的位置,codeJan 想要知道游览 m 个城市至少需要走多少米?
输入描述:
- 第一行是一个T≤20代表测试组数。
每组第一行是三个正整数n,m,p,分别代表城市数量、codeJan想要浏览的城市数量和codeJan当前的位置(单位为米)。
第二行包含n个正整数pos[i]表示第i个城市的位置,单位为米。
输入保证pos[i]<pos[i+1](i∈[1,n−1]),并且p ≠ pos[i](i∈[1,n])。
输出描述:
- 对于每组输入数据输出一个正整数表示 codeJan 至少需要走的距离。
输入
- 3
- 2 2 2
- 1 3
- 2 2 1
- 2 3
- 4 3 4
- 1 3 5 6
输出
- 3
- 2
- 3
说明
- 对于第一个样例的坐标最优移动顺序可以是:2→3→1,移动距离一共是3。
对于第二个样例的坐标最优移动顺序可以是:1→2→3,移动距离一共是2。
对于第三个样例的坐标最优移动顺序可以是:4→5→6→5,移动距离一共是3。
备注:
- 2≤n≤105,1≤m≤105 ,1≤p,pos[i]≤109。
题解
想法题。
最优答案来自于以下几种情况,取个最小值即可。
往右走,走到某点后在两点之间徘徊
往左走, 走到某点后在两点之间徘徊
往左一步,再往右走,走到某点后在两点之间徘徊
往右一步,在往左走,走到某点后在两点之间徘徊
在$p$左右两个城市之间徘徊
- #include <bits/stdc++.h>
- using namespace std;
- const int maxn = 1000000 + 10;
- int T, n, m;
- long long p;
- long long a[maxn];
- int main() {
- scanf("%d", &T);
- while(T --) {
- long long ans = 1e18;
- scanf("%d%d%lld", &n, &m, &p);
- for(int i = 1; i <= n; i ++) {
- scanf("%lld", &a[i]);
- }
- n ++;
- a[n] = p;
- sort(a + 1, a + n + 1);
- int location;
- for(int i = 1; i <= n; i ++) {
- if(a[i] == p) location = i;
- }
- if(location > 1) {
- long long sum = 0;
- int num = 0;
- for(int i = location - 1; i >= 1; i --) {
- long long dis = a[i + 1] - a[i];
- sum = sum + dis;
- num ++;
- if(num > m) break;
- if(i != location - 1) {
- ans = min(ans, sum + 1LL * dis * (m - num));
- }
- }
- }
- if(location < n) {
- long long sum = 0;
- int num = 0;
- for(int i = location + 1; i <= n; i ++) {
- long long dis = a[i] - a[i - 1];
- sum = sum + dis;
- num ++;
- if(num > m) break;
- if(i != location + 1) {
- ans = min(ans, sum + 1LL * dis * (m - num));
- }
- }
- }
- if(location > 1 && location < n) {
- ans = min(ans, min(a[location] - a[location - 1], a[location + 1] - a[location]) + 1LL * (m - 1) * (a[location + 1] - a[location - 1]));
- long long sum = (a[location + 1] - a[location]) * 2;
- int num = 1;
- for(int i = location - 1; i >= 1; i --) {
- long long dis = a[i + 1] - a[i];
- sum = sum + dis;
- num ++;
- if(num > m) break;
- if(i != location - 1) {
- ans = min(ans, sum + 1LL * dis * (m - num));
- }
- }
- sum = (a[location] - a[location - 1]) * 2;
- num = 1;
- for(int i = location + 1; i <= n; i ++) {
- long long dis = a[i] - a[i - 1];
- sum = sum + dis;
- num ++;
- if(num > m) break;
- if(i != location + 1) {
- ans = min(ans, sum + 1LL * dis * (m - num));
- }
- }
- }
- printf("%lld\n", ans);
- }
- return 0;
- }
Wannafly挑战赛7 B - codeJan与旅行的更多相关文章
- Wannafly挑战赛7 D - codeJan与青蛙
codeJan喜欢观察世界.有一天,codeJan发现一个非常奇怪的现象.有一些年轻的青蛙聚集在一条直线上的某些位置上,同一个位置可能有多个青蛙.这些青蛙每次只会向前跳一米,并且每只青蛙每跳一次都会发 ...
- 【Wannafly挑战赛24E】旅行
[Wannafly挑战赛24E]旅行 题面 牛客 题解 首先有一个非常显然的\(dp\):我们直接把\(s\rightarrow t\)的路径抠出来然后设\(f_{i,j}\)表示到第\(i\)个点, ...
- Wannafly挑战赛25游记
Wannafly挑战赛25游记 A - 因子 题目大意: 令\(x=n!(n\le10^{12})\),给定一大于\(1\)的正整数\(p(p\le10000)\)求一个\(k\)使得\(p^k|x\ ...
- Wannafly挑战赛27
Wannafly挑战赛27 我打的第一场$Wannafly$是第25场,$T2$竟然出了一个几何题?而且还把我好不容易升上绿的$Rating$又降回了蓝名...之后再不敢打$Wannafly$了. 由 ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- Wannafly挑战赛21A
题目链接 Wannafly挑战赛21A 题解 代码 #include <cstdio> #include <cmath> #define MAX 1000005 #define ...
- Wannafly挑战赛24游记
Wannafly挑战赛24游记 A - 石子游戏 题目大意: A和B两人玩游戏,总共有\(n(n\le10^4)\)堆石子,轮流进行一些操作,不能进行下去的人则输掉这局游戏.操作包含以下两种: 把石子 ...
- Wannafly挑战赛25C 期望操作数
Wannafly挑战赛25C 期望操作数 简单题啦 \(f[i]=\frac{\sum_{j<=i}f[j]}{i}+1\) \(f[i]=\frac{f[i]}{i}+\frac{\sum_{ ...
- Wannafly挑战赛18B 随机数
Wannafly挑战赛18B 随机数 设\(f_i\)表示生成\(i\)个数有奇数个1的概率. 那么显而易见的递推式:\(f_i=p(1-f_{i-1})+(1-p)f_{i-1}=(1-2p)f_{ ...
随机推荐
- [吴恩达机器学习笔记]14降维5-7重建压缩表示/主成分数量选取/PCA应用误区
14.降维 觉得有用的话,欢迎一起讨论相互学习~Follow Me 14.5重建压缩表示 Reconstruction from Compressed Representation 使用PCA,可以把 ...
- MongoDB常用方法
一.查询 find方法 db.collection_name.find(); 查询所有的结果: select * from users; db.users.find(); 指定返回那些列(键): se ...
- 如何写出高性能SQL语句
优化SQL查询:如何写出高性能SQL语句 1.首先要搞明白什么叫执行计划? 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生欀如一条SQL语句如果 ...
- 使用Docker 快速搭建nuget本地服务器,Hosting private nuget server using docker in seconds!
Server #below line automatically creates the folder, mount the volumes and maps the ports. docker ru ...
- 【洛谷 P4072】 [SDOI2016]征途(斜率优化)
好久没写斜率优化板子都忘了, 硬是交了十几遍.. 推一下柿子就能得到答案为 \[m*\sum x^2-(\sum x)^2\] 后面是个定值,前面简单dp,斜率优化一下就行了. \(f[i][j]=f ...
- ue4 TimeRemaining(ratio)找不到的问题
最近看ue4的Blueprint 3rd Person Game的教学视频,其中第十集https://docs.unrealengine.com/latest/INT/Videos/PLZlv_N0_ ...
- flex实例(阮一峰)
Flex 布局教程:实例篇 作者: 阮一峰 日期: 2015年7月14日 上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法. 你会看到,不管是什么布局,Flex往往都可以几行命令 ...
- 多进程Process
多进程旧式写法 from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': p = Pool(5) ...
- Spring Tool Suite 配置和使用
Spring Tool Suite使用 1.下载地址: http://spring.io/tools 2.配置字符编码:UTF-8 默认的编码是ISO-8859-1的西欧文字编 1.windows-- ...
- 15个你不得不知道的Chrome dev tools的小技巧
转载自:https://www.imooc.com/article/2559 谷歌浏览器如今是Web开发者们所使用的最流行的网页浏览器.伴随每六个星期一次的发布周期和不断扩大的强大的开发功能,Chro ...