Zerojudge h084

首次架設靜態網站,如有疏失,還請多多包涵。歡迎來信zhuastor@gmail.com

解題心得

這題是2022年一月份的APCS第四題,順便跟大家提一下我那場檢定的策略,第一二題寫完先重點檢查第二題,然後在寫第三題,最後在看看第四題
因此我在Debug跟思考前三題花了大量時間,不過其實還蠻合理的,因為當時的我APCS實作最高才二級分而已(前幾次發生了難以想像的粗心),所以策略相當保守,
那場檢定我拿了280分,最後第四題我花了幾分鐘快速寫個PQ拿60分而已,在聽完別人解法才驚覺這題是我相對拿手的二分搜。
突然覺得標籤這東西,有時候也會局限解題的方向。

解題想法

就是二分搜而已,我沒有用到什麼額外的技巧。不過在二分搜裡面倒是有些地方需要注意,這部分就提醒同學要留意一下,我自己也吃了一個NA哈哈。

AC code

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,k;
int h[200005];
int w[200005];
bool check(ll int glo){
    int num=0;//主要紀錄h陣列中大於glo的變數(但有其他操作)
    int step=0;//index,遍歷w陣列
    for(int x=0;x<n;x++){
        if(h[x]<glo && num>0)num=0;
        if(h[x]>=glo)num++;
        if(num==w[step]){
            num=0;
            step++;
        }
        if(step>=k)return true;
    }
    if(step<k)return false;
}
int main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin >> n >> k;
    for(int x=0;x<n;x++)cin >> h[x];
    for(int x=0;x<k;x++)cin >> w[x];
    ll int leftd=1,mid,rightd=1e9+1;
    ll int pos;
    while(leftd<rightd){
        mid=(leftd+rightd)/2;
        if(check(mid)){
            leftd=mid+1;
            pos=leftd-1;//還請同學特別注意
        }
        else{
            rightd=mid;
            pos=rightd-1;//還請同學特別注意
        }
    }
    cout << pos << endl;
    return 0;
}

題目連結 : 2022年1月APCS 4.牆上海報