80分求调
查看原帖
80分求调
451683
ldj1231楼主2021/11/18 09:42
#include<iostream>
#include<algorithm>
#include<cstring>
#define x first
#define y second

using namespace std;

const int N = 10010 , M = 3010;
typedef pair<int,int> PII;

int n , m , k;
PII bird[N] , pipe[N]; 
int f[N][M]; // 表示经过(i , j)所需要的最小点击数 

int main()
{
	cin >> n >> m >> k;
	
	for(int i = 1 ; i <= n ; i ++)
	{
		int x , y;
		cin >> x >> y;
		bird[i] = {x , y};
	}
	
	for(int i = 1 ; i <= k ; i ++)
	{
		int p , l , h;
		cin >> p >> l >> h;
		pipe[p] = {l , h};
	}
	
	memset(f , 0x3f , sizeof f);
	for(int i = 1 ; i <= m ; i ++) f[0][i] = 0; //从起点任意高度出发 
	
	for(int i = 1 ; i <= n ; i ++)
	{
		int add = bird[i].x , sub = bird[i].y;
		if(pipe[i].y)
		{
			
			for(int j = pipe[i].x + 1 ; j < pipe[i].y ; j ++)
			{
			    if(j + sub <= m) f[i][j] = min(f[i - 1][j + sub] , f[i][j]);
			    if(j - add > 0)	 
			    {
			        f[i][j] = min(f[i][j] , f[i][j - add] + 1);
			        f[i][j] = min(f[i][j] , f[i - 1][j - add] + 1);
			    }
			}
		}
		else
		{

			for(int j = 1 ; j <= m + add ; j ++)	
			{
			    if(j + sub <= m) f[i][j] = min(f[i - 1][j + sub] , f[i][j]);
			    if(j - add > 0)	 
				{
				    f[i][min(j , m)] = min(f[i][min(j , m)] , f[i - 1][j - add] + 1);
				    f[i][min(j , m)] = min(f[i][min(j , m)] , f[i][j - add] + 1);
				}
			}
				
		}
		
	} 
	
	int x = 0;
	for(int i = 1 ; i <= n ; i ++)
	    for(int j = 1 ; j <= m ; j ++)
            if(f[i][j] != 0x3f3f3f3f)
            {
                x = max(x , i);
                break;
            }
	
	if(x == n) 
	{
		int minv = 0x3f3f3f3f;
		for(int i = 1 ; i <= m ; i ++) minv = min(minv , f[n][i]);
		cout << "1" << endl;
		cout << minv << endl;
	}
	else
	{
		cout << "0" << endl;
		int sum = 0;
		for(int i = 1 ; i <= x ; i ++) if(pipe[i].y) sum ++;
		cout << sum << endl;
	}
	
	return 0;
}
2021/11/18 09:42
加载中...