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_{ ...
随机推荐
- [DeeplearningAI笔记]序列模型2.6Word2Vec/Skip-grams/hierarchical softmax classifier 分级softmax 分类器
5.2自然语言处理 觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.6 Word2Vec Word2Vec相对于原先介绍的词嵌入的方法来说更加的简单快速. Mikolov T, Chen ...
- Bootstrap笔记-加强版
1.bootstrap引入: <!DOCTYPE html><html lang="zh-cn"><head><meta charset= ...
- JS函数表达的几种写法
arguments数组形式的 用于函数 比如不知道参数有多少个或者不固定那么用到arguments function show(){ //alert(arguments.;length); ale ...
- poi复杂excel的实现
一:前言 最近帮一个朋友做excel的导出功能,对于我来说还是挺头疼,我看了下表格样式,对于我来说还是挺头疼的,想当年耗子刚刚出社会的时候做的第一份工作,第一份任务就是把把word转换为html,在这 ...
- HDU 2298 三分
斜抛从(0,0)到(x,y),问其角度. 首先观察下就知道抛物线上横坐标为x的点与给定的点的距离与角度关系并不是线性的,当角度大于一定值时可能会时距离单调递减,所以先三分求个角度范围,保证其点一定在抛 ...
- 26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL
26 THINGS I LEARNED IN THE DEEP LEARNING SUMMER SCHOOL In the beginning of August I got the chance t ...
- C# 遍历枚举
C#中,如何获取(遍历)枚举中所有的值: public enum Suits { Spades, Hearts, Clubs, Diamonds, NumSuits } private static ...
- 利用media query写响应式布局
最近才接触到响应式布局的概念,之前用到的bootstrap就是一种响应式布局的框架.学习的时候参考了http://blog.csdn.net/shoyer/article/details/829301 ...
- 【leetcode 简单】第十五题 加一
给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组. 最高位数字存放在数组的首位, 数组中每个元素只存储一个数字. 你可以假设除了整数 0 之外,这个整数不会以零开头. 示例 1: ...
- HDU 1148 Rock-Paper-Scissors Tournament (模拟)
题目链接 Problem Description Rock-Paper-Scissors is game for two players, A and B, who each choose, inde ...