社区讨论

95求助!13号1 9875输出1 9872

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

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lo2k58cz
此快照首次捕获于
2023/10/23 15:09
2 年前
此快照最后确认于
2023/10/23 15:09
2 年前
查看原帖
CPP
#include<bits/stdc++.h>

using namespace std;

int n,m,k,x[10001][2],p[10001][2];
int f[10001][1001][2];

int min(int a,int b) {
	return a>b?b:a;
}

int has(int i,int j) {
	return f[i][j][0]?f[i][j][1]:0x3f3f3f3f;
}

int main() {
	scanf("%d %d %d",&n,&m,&k);
	for(int i=1; i<=n; i++) {
		scanf("%d %d",&x[i][0],&x[i][1]);
		p[i][0]=m+1;
		f[0][i][0]=1;
	}
	for(int i=1; i<=k; i++) {
		int p_,l,h;
		scanf("%d %d %d",&p_,&l,&h);
		p[p_][0]=h;
		p[p_][1]=l;
	}
	for(int j=0; j<=m; j++)
		f[0][j][0]=1;
	for(int i=1; i<=n; i++) {
		for(int j=x[i][0]; j<=m+x[i][0]; j++) {
			if(j<=m) {
				if(f[i-1][j-x[i][0]][0]||f[i][j-x[i][0]][0])
					f[i][j][1]=min(has(i-1,j-x[i][0])+1,has(i,j-x[i][0])+1),f[i][j][0]=1;
			} else {
				if(f[i-1][j-x[i][0]][0]||f[i][j-x[i][0]][0])
					f[i][m][1]=min(min(has(i,j-x[i][0])+1,has(i-1,j-x[i][0])+1),has(i,m)),f[i][m][0]=1;
			}
		}
		for(int j=m; j>=x[i][1]; j--)
			if(f[i-1][j][0])
				f[i][j-x[i][1]][1]=min(f[i-1][j][1],has(i,j-x[i][1])),f[i][j-x[i][1]][0]=1;
		for(int j=m; j>=p[i][0]; j--)
			f[i][j][0]=0;
		for(int j=p[i][1]; j>=0; j--)
			f[i][j][0]=0;
		bool can=false;
		for(int j=0; j<=m; j++)
			if(f[i][j][0]) {
				can=true;
				break;
			}
		if(!can) {
			int num=0;
			for(int j=1; j<i; j++)
				if(p[j][0]!=m+1)
					num++;
			printf("0\n%d",num);
			return 0;
		}
	}
	int mi=0x3f3f3f3f;
	for(int i=1; i<=m; i++)
		if(f[n][i][0])
			mi=min(mi,f[n][i][1]);
	printf("1\n%d",mi);
}

回复

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

正在加载回复...