AtCoder Beginner Contest 172 比賽人數10142 比賽開始後6分鐘看到A題,之後,比賽開始後8分鐘看到所有題
AtCoder Beginner Contest 172 C Tsundoku 三心二意還是一心一意
總目錄詳見https://blog.csdn.net/mrcrack/article/details/104454762
在線測評地址https://atcoder.jp/contests/abc172/tasks/abc172_c
題目大意:給出兩個棧,裏面裝有書,閱讀書籍需要時間,讀書需從棧頂開始往下讀,每本書有閱讀時間限制,給定時間,要求閱讀儘可能多的書,輸出最大書的數量。
該題難在找到一個如下好的測試數據:
5 7 50
15 10 1 1 1
30 15 1 1 1 1 1
如上數據最優選取過程如下
數組a 15 10 1 1 1
數組b 30 15 1 1 1 1 1
選取過程如下
30(b),15(b),1(b),1(b),1(b),1(b),1(b)
共選出7本書
前四題中,該題難度最大,難倒了幾千人。被難住的大都用的是三心二意投機的做法,哪個棧頂元素小選哪個。
殊不知,該題需一心一意,找準一個棧深挖到底,再不斷的割捨該棧中的底部元素,選擇另一個棧的元素。
真正在編碼過程中,邊界問題,處理起來也比較費勁。
AC代碼如下
#include <cstdio>
#include <algorithm>
#define maxn 200010
using namespace std;
int a[maxn],b[maxn],sum;
int main(){
int n,m,k,i,j,ans;
scanf("%d%d%d",&n,&m,&k);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
for(i=1;i<=m;i++)scanf("%d",&b[i]);
i=j=1;
while(i<=n&&sum+a[i]<=k)sum+=a[i],i++;//結束條件,要麼i==n+1,要麼sum+a[i]>k
while(j<=m&&sum+b[j]<=k)sum+=b[j],j++;//結束條件,要麼j==m+1,要麼sum+b[j]>k
i--,j--;//保證i,j對應的sum<=k
ans=i+j;
while(i){
sum-=a[i],i--;
j++;//此句別忘了
while(j<=m&&sum+b[j]<=k)sum+=b[j],j++;//結束條件,要麼j==m+1,要麼sum+b[j]>k
j--;
ans=max(ans,i+j);
}
printf("%d\n",ans);
return 0;
}