题解:P15017 [UOI 2020 II Stage] 大炮

· · 题解

解题思路

因为每次大炮都会让哥萨克胡子向上 45 度飞行直到撞上钟乳石,所以我们用一个变量 h 来记录哥萨克胡子的高度,并每次增加 1,按照题意模拟。

若当前的高度 h 大于等于 a_{i},那么他就要下落,因此计数器要加一,高度要变成零,且下标要减一,往前一次遍历。

代码实现

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e5+100;
int n,h,sum,a[N];//h:高度 
signed main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        if(h==0){
            sum++;//撞上钟乳石后,次数加1 
        }
        if(i==n){
            cout<<sum;
            return 0;//抵达终点
        }
        h++;//高度增加
        if(h>=a[i+1]){
            h=0,i--;//撞上钟乳石,向前重新遍历 
        }
    }
    return 0;//别忘记写
}