JZ初中OJ 1999.[2015.8.6普及组模拟赛] Wexley接苹果

题目描述

         Wexley最近发现了一个古老的屏幕游戏。游戏的屏幕被划分成n列。在屏幕的底端,有一个宽为m列的篮子(m<n)。在游戏过程中,Wexley能左右移动这个篮子,            Wexley的操作很犀利,移动是瞬间完成的,但是篮子必须始终都在屏幕中。 苹果从屏幕的顶端落下,每个苹果从n列中的某一列顶端掉落,垂直掉落到屏幕的底端。每个苹果总是在上一个苹果掉落到底端的时候开始掉落。Wexley想要通过移动篮子来接住所有的苹果。起先,篮子在屏幕的最左端。
         求出Wexley要接住所有的苹果所需移动的最短距离。 
 

输入

第一行,两个整数n、m,如题所述
第二行,一个整数k,表示掉落的苹果总数
接下来k行,每行一个整数Ai,表示每个苹果掉落的位置

输出

一行一个整数,表示所需移动最短距离
 

样例输入

Sample Input1:
5 1
3
1
5
3

Sample Input2:
5 2
3
1
5
3

 

样例输出

Sample Output1:
6

Sample Output2:
4

 
 

数据范围限制

【数据范围】
对于30%的数据,m<n<=5,k<=10
对于100%的数据,1<=m<n<=10,1<=k<=20
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,k,a[21];
 4 int b[21],head,ans,tmp;
 5 int main()
 6 {
 7     freopen("apple.in","r",stdin);
 8     freopen("apple.out","w",stdout);
 9     cin>>n>>m>>k;
10     b[0]=1;
11     for(int i=1;i<=k;i++)
12     {
13         cin>>a[i];
14     }
15     head=m;
16     for(int i=1;i<=k;i++)
17     {
18         if(head>=a[i] && (head-m+1)<=a[i])
19         continue;
20         if(head<a[i])
21         {
22             ans+=a[i]-head;
23             head+=a[i]-head;
24             continue;
25         }
26         if((head-m+1)>a[i])
27         {
28             int tmp=head;
29             head=a[i]+m-1;
30             ans+=tmp-head;
31             continue;
32         }
33     }
34     cout<<ans;
35 }
原文地址:https://www.cnblogs.com/dsanying/p/11305423.html