社区讨论

蒟蒻求条

P1052[NOIP 2005 提高组] 过河参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjumyzx
此快照首次捕获于
2025/11/04 08:47
4 个月前
此快照最后确认于
2025/11/04 08:47
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
int ans=INT_MAX;
int l;
int s,t,m;
int dp[1000010];
struct Q{
	int num;
	int tim;
}q[1000010];
vector<int> stone;
int main(){
    cin>>l>>s>>t>>m;
    for(int i=1,x;i<=m;i++){
    	cin>>x;
    	stone.push_back(x);
	}
	sort(stone.begin(),stone.end());
	int last;
	if(stone[0]>s*t){
		dp[s*t]=1;
		last=s*t;
	}else{
		dp[stone[0]]=1;
		last=stone[0];
	}
	for(int i=1;i<stone.size();i++){
		if(stone[1]-stone[0]>=s*t){
			last+=s*t;
			dp[last]=1;
		}else{
			last+=stone[i]-stone[i-1];
			dp[last]=1;
		}
	}
	int head=1,tail=0;
	for(int i=1;i<=last+t;i++){
		if(i>=s){
			while(tail>=head and dp[i-s]<q[tail].num)--tail;
			q[++tail]={dp[i-s],i-s};
			while(q[head].tim<i-t)++head;
		}
		dp[i]+=q[head].num;
	}
	for(int i=last;i<=last+t;i++)ans=min(ans,dp[i]);
	cout<<ans;
    return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...