1999. 【2015.8.6普及组模拟赛】Wexley接苹果(apple)
题目:
Wexley最近发现了一个古老的屏幕游戏。游戏的屏幕被划分成n列。在屏幕的底端,有一个宽为m列的篮子(m<n)。在游戏过程中,Wexley能左右移动这个篮子, Wexley的操作很犀利,移动是瞬间完成的,但是篮子必须始终都在屏幕中。 苹果从屏幕的顶端落下,每个苹果从n列中的某一列顶端掉落,垂直掉落到屏幕的底端。每个苹果总是在上一个苹果掉落到底端的时候开始掉落。Wexley想要通过移动篮子来接住所有的苹果。起先,篮子在屏幕的最左端。
求出Wexley要接住所有的苹果所需移动的最短距离。
输入:
第一行,两个整数n、m,如题所述
第二行,一个整数k,表示掉落的苹果总数
接下来k行,每行一个整数Ai,表示每个苹果掉落的位置
输出:
一行一个整数,表示所需移动最短距离
数据范围限制
【数据范围】
对于30%的数据,m<n<=5,k<=10
对于100%的数据,1<=m<n<=10,1<=k<=20
对于30%的数据,m<n<=5,k<=10
对于100%的数据,1<=m<n<=10,1<=k<=20
思路:
首先是从左往右走,因为是瞬间移动,我们只需要找出篮子的范围,对与超出范围的目标判断是在左边还是右边然后将篮子移动,简单的模拟题,上代码。
CODE
#include<cstdio> #include<iostream> #include<cmath> using namespace std; int n,m,k,ans=0,way; int a[21]; int main() { freopen("apple.in","r",stdin); freopen("apple.out","w",stdout); cin>>n>>m>>k; way=m; for(int i=1;i<=k;i++) cin>>a[i]; for(int i=1;i<=k;i++) { if(a[i]>way) { ans=a[i]-way+ans; way=a[i]; cout<<a[i]<<" "<<way<<" "<<ans<<endl; } else if(a[i]<way+1-m) { ans=way-m+1-a[i]+ans; way=a[i]; cout<<a[i]<<" "<<way<<" "<<ans<<endl; } } cout<<ans; return 0; }
完结撒花!!!
众生,与我如浮云