AtCoder Beginner Contest 172 C Tsundoku 三心二意還是一心一意

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章