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