abc446_c反思

这题是考的队列/指针的模拟,我一开始写的在数组里面用指针去记录最前面的可以用鸡蛋的天数和可以用的鸡蛋天数,导致代码异常的难写,写了一会儿就去做第4题了。后面和deepseek进行了一番争吵,最后发现用先在用到第几天这个指针来记录会更简单,看了题解后发现用队列去模拟好像更简单。
总结一下:

  1. 一个题用指针在数组里模拟可以想想用队列会不会更简单
  2. 当你用指针很难写时,想想换一个指针来写

代码附上:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
const int N=2e5+10;
int T;
int n,d;
int eggs[N];
int A[N],B[N];
int read(){
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch)){
		ch=getchar();
		if(ch=='-') f=-1;
	}
	while(isdigit(ch)){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}
void solve(){
	n=read(),d=read();
	for(int i=1;i<=n;i++){
		A[i]=read();
		eggs[i]=A[i];
	}
	for(int i=1;i<=n;i++){
		B[i]=read();
	}
	int fir=1;
	for(int i=1;i<=n;i++){
		int need=B[i];
		while(need>0&&fir<=i){
			if(eggs[fir]>need){
				eggs[fir]-=need;
				need=0;
			}else{
				need-=eggs[fir];
				eggs[fir]=0;
				fir++;
			}
		}
		while(fir<=i&&i-fir>=d){
			fir++;
		}
	}
	int ans=0;
	for(int i=fir;i<=n;i++){
		ans+=eggs[i];
	}
	cout<<ans<<endl;
} 
signed main(){
	T=read();
	while(T--) solve(); 
	return 0;
}

posted @ 2026-03-17 22:02  ThomasHang  阅读(18)  评论(0)    收藏  举报