社区讨论

80分求助

P1941[NOIP 2014 提高组] 飞扬的小鸟参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lob9cacl
此快照首次捕获于
2023/10/29 17:17
2 年前
此快照最后确认于
2023/11/03 23:18
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int f[10003][1003],a[10005],b[10005],l[10005],r[10005];
inline int read(){
	int w=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		w=(w<<1)+(w<<3)+(ch-48);
		ch=getchar();
	}
	return w*f;
}
int main(){
	int n,m,k,x,p=0,ans=0x3f3f3f3f;
	n=read();m=read();k=read(); 
	memset(f,0x3f,sizeof(f));
	l[n]=0;r[n]=m+1;
	for(int i=0;i<n;i++){
		a[i]=read();b[i]=read();
		if(i==0) l[i]=-1;
		else l[i]=0;
		r[i]=m+1;
	}
	for(int i=1;i<=k;i++){
		x=read();
		l[x]=read();r[x]=read();
	}
	for(int i=0;i<=m;i++) f[0][i]=0;
	for(int i=0;i<n;i++){
		bool flag=0;
		for(int j=l[i]+1;j<r[i];j++){
			int t=1;
			if(f[i][j]>=0x3f3f3f) continue;
			if(j-b[i]>l[i+1] && j-b[i]<r[i+1]){
				flag=1;
				f[i+1][j-b[i]]=min(f[i+1][j-b[i]],f[i][j]);
			}
			while(j+a[i]*t<=l[i+1]) t++;
			while(j+a[i]*t<r[i+1]){
				flag=1;
				f[i+1][j+a[i]*t]=min(f[i+1][j+a[i]*t],f[i][j]+t);
				t++;
			}
			if(r[i+1]==m+1){
				flag=1;
				f[i+1][m]=min(f[i+1][m],f[i][j]+t);
			}
		}
		if(!flag){
			printf("0\n%d\n",p);
			return 0;
		}
		else if(i>0 && (l[i]>0||r[i]<m+1)) p++;
	}
	for(int i=1;i<=m;i++) ans=min(ans,f[n][i]);
	printf("1\n%d\n",ans);
	return 0;
}

回复

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

正在加载回复...