85 pts
查看原帖
85 pts
1046223
Star_Sky_楼主2024/9/20 20:27
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;

int n, m, k, l, h, ans1, ans2, cnt, yy;
int a[10005], b[10005], x[10005], y[10005], p[10005];
int dp[10005][1005];
bool flag;
bool f[10005][1005];

//test
bool go[10005][1005];

int main(){
	memset(dp, 0x3f, sizeof(dp));
	
	scanf("%d%d%d", &n, &m, &k);
	
	for(int i=0; i<n; i++)scanf("%d%d", &x[i], &y[i]);
	
	for(int i=0; i<=n; i++)a[i]=0, b[i]=m+1;
	for(int i=0; i<k; i++)scanf("%d%d%d", &p[i], &l, &h), a[p[i]]=l, b[p[i]]=h;
	
	for(int i=0; i<=m; i++)f[0][i]=1, dp[0][i]=0;
	
	for(int i=0; i<=n; i++){
		cout<<"line:"<<i<<"   from:"<<a[i]+1<<" to:"<<b[i]-1<<"   up:"<<x[i]<<" down:"<<y[i]<<endl;
		for(int j=1; j<=m; j++){
			if(f[i][j]){
				cnt=i;
				
				//test
				go[i][j]=true;
				
				//向上转移
				yy=min(j+x[i],m);
				dp[i][yy]=min(dp[i][yy], dp[i][j]+1); 
				f[i][yy]=true;
				
				//向右直接转移
				yy=min(j+x[i],m);
				if(yy>a[i+1]&&yy<b[i+1]){
					dp[i+1][yy]=min(dp[i+1][yy], dp[i][j]+1); 
					f[i+1][yy]=true;					
				}

				
				//不点
				yy=max(j-y[i],0);
				if(yy>a[i+1]&&yy<b[i+1]){
					dp[i+1][yy]=min(dp[i+1][yy], dp[i][j]); 
					f[i+1][yy]=true;					
				}

			}
		}
	}
	
	//test
//	printf("\n   ");
//	for(int i=0; i<=n; i++)printf("   %d", i);
//	printf("\n\n");
//	for(int j=m; j>=0; j--){
//		printf("%2d  ", j);
//		for(int i=0; i<=n; i++){
//			printf("%3d ", go[i][j]?dp[i][j]:-1);
//		}
//		printf("\n");
//	}
//	printf("\n");
	
	for(int i=1; i<=m; i++)
		if(f[n][i])
			flag=true;
	
	if(flag){
		ans1=999999999;
		for(int i=1; i<=m; i++)
			if(f[n][i])
				ans1=min(ans1, dp[n][i]);
		
		printf("%d\n%d", flag, ans1);
	}
	else{
//		cout<<"cnt:"<<cnt<<endl;
		
		for(int i=0; i<k; i++)
			if(cnt>=p[i])
				ans2++;
		
		printf("%d\n%d", flag, ans2);
	}
	
	return 0;
}
2024/9/20 20:27
加载中...