首次架設靜態網站,如有疏失,還請多多包涵。歡迎來信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.牆上海報