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_{ ...
随机推荐
- c# 一个关于时间截断的算法取巧
场景如下: 在某一段时间内(有规律,以一个星期为最大区间),从一个时间区间中排除另外一个或者多个时间区间后,返回时间区间集合. 举例如下: //时间区间:2018-02-01~2018-02-07 / ...
- TCP和UDP相关概念
位于传输层的协议,都是基于IP协议的. TCP是面向连接的.可靠的传输,UDP是无连接的.不可靠的传输.要进行TCp传输时候,需要进行三次握手,建立连接,然后才能发送数据,而且在发送过程中,有数据的确 ...
- Css Sprite 图片等比缩放图片大小
图片大小80*40,即每张图片大小40*40,如何以20*20显示图片?1. 首先看下如何以40*40显示第二张图片: 正常显示css代码 .sprite { background-image: ur ...
- ArrayList既然继承自AbstractList抽象类,而AbstractList已经实现了List接口,那么ArrayList类为何还要再实现List接口呢?
https://www.cnblogs.com/bluejavababy/p/4320545.html
- 【Atcoder】AGC 020 B - Ice Rink Game 递推
[题意]n个人进行游戏,每轮只保留最大的a[i]倍数的人,最后一轮过后剩余2人,求最小和最大的n,或-1.n<=10^5. [算法]递推||二分 [题解]令L(i),R(i)表示第i轮过后的最小 ...
- Python :集合类型(set)
set 是一个无序的元素集合,支持并.交.差及对称差等数学运算, 但由于 set 不记录元素位置,因此不支持索引.分片等序列的操作. 一.初始化 s0 = set() d0 = {} s1 = {0} ...
- Java 注解全面解析
1.基本语法 注解定义看起来很像接口的定义.事实上,与其他任何接口一样,注解也将会编译成class文件. @Target(ElementType.Method) @Retention(Retentio ...
- LintCode之二叉树的最大节点
分治问题,可以把整棵树看做是由一颗颗只有三个节点组成的小树,一颗树的构成是根节点.左子树.右子树,这样只需要从左子树找出一个最大的节点,从右子树找出一个最大的节点,然后与根节点三个取个最大的,就是最终 ...
- Xcode下 gdb 调试命令
Xcode的调试器为用户提供了一个GDB的图形化界面,GDB是GNU组织的开放源代码调试器.您可以在Xcode的图形界面里做任何事情:但是,如果您需要您可以在命令行里使用GDB的命令,且gdb可以在终 ...
- Linux 用户态与内核态的交互【转载】
Linux 用户态与内核态的交互 在 Linux 2.4 版以后版本的内核中,几乎全部的中断过程与用户态进程的通信都是使用 netlink 套接字实现的,例如iprote2网络管理工具,它与内核的交 ...