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

 

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