题目描述
小明最近在玩接蛋糕的游戏。
在屏幕的底端,有一个宽为 𝑚 列的篮子。在游戏过程中,小明能左右移动这个篮子,移动是瞬间完成的,但是篮子必须始终都在屏幕中。
蛋糕从屏幕的顶端落下,每个蛋糕从 𝑛 列中的某一列顶端掉落,垂直掉落到屏幕的底端。每个蛋糕总是在上一个蛋糕掉落到底端的时候开始掉落。小明想要通过移动篮子来接住所有的蛋糕。起先,篮子在屏幕的最左端。
求出小明要接住所有的蛋糕所需移动的最短距离。
输入
第一行,两个整数 𝑛,𝑚 。
第二行,一个整数 𝑘,表示掉落的蛋糕总数。
接下来 𝑘 行,每行一个整数 𝑎𝑖,表示每个蛋糕掉落的位置。
输出
一行一个整数,表示所需移动最短距离。
输入样例
【输入样例1】 5 1 3 1 5 3 【输入样例2】 5 2 3 1 5 3
输出样例
【输出样例1】 6 【输出样例2】 4
说明
【数据范围】
对于 30% 的数据,1≤𝑚<𝑛<5 ,1≤𝑘≤10。
对于 100% 的数据,1≤𝑚<𝑛≤10 ,1≤𝑘≤20。
CODE:
#include<bits/stdc++.h>
using namespace std;
int x,l=1,m,n,k,ans;
int main()
{//简单的模拟,为了移动距离最短,每次按蛋糕位置移动即可
// freopen("cake.in","r",stdin);
// freopen("cake.out","w",stdout);
ios::sync_with_stdio(0);
cin>>n>>m>>k;
for(int i=1;i<=k;i++)
{
cin>>x;//获取蛋糕位置
if(x>=l && x<=l+m-1) continue;//刚好接住
if(l<x)
{//在左边,使篮子最左边碰到蛋糕
ans+=x-l-(m-1);
l=x-m+1;//移动篮子
}
else
{//在右边,使篮子最右端碰到蛋糕
ans+=l-x;
l=x;//移动篮子
}
}
cout<<ans;
return 0;
}