D. Proyectores (pensamiento + distancia de enumeración)

 https://codeforces.com/contest/1408/problem/D

Ideas:

Hay mucha gente y muchos monitores, considere la enumeración.

Considere separar las coordenadas horizontal y vertical.

Enumerar primero en el seguimiento del trabajo efectivo.

Considere que para cada monitor cuya diferencia de abscisas es x, la persona que corresponde al monitor cuya diferencia de abscisas es x necesita subir al menos y pasos para escapar.

Luego enumeremos el número de pasos para ir directamente desde el máximo 1e6 a 0, cuál es el número mínimo de pasos que pueden subir + ir a la derecha.

Qué significa eso?

Es la enumeración del número de pasos de la derecha al pequeño. Por ejemplo, si la enumeración da x pasos hacia la derecha, entonces debe asegurarse que las personas que pueden escapar caminando hacia la derecha <x pasos deben escapar. Luego, los restantes que no pueden escapar caminando hacia la derecha actualizan el valor máximo de la caminata hacia arriba durante el proceso de enumeración, y esas personas escapan caminando hacia arriba.

Por tanto, equivale a enumerar todas las situaciones en las que se debe escapar al número de escalones que suben y al que van hacia la derecha.

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<cstdio>
#include<algorithm>
#define debug(a) cout<<#a<<"="<<a<<endl;
using namespace std;
const int maxn=2e3+100;
typedef int LL;
struct rob{
	LL x,y;
}re[maxn];
struct light{
	LL x,y;
}li[maxn];
LL v[1000060];
int main(void)
{
  cin.tie(0);std::ios::sync_with_stdio(false);
  LL n,m;cin>>n>>m;
  for(LL i=1;i<=n;i++){
  	cin>>re[i].x>>re[i].y;
  }
  for(LL j=1;j<=m;j++){
  	cin>>li[j].x>>li[j].y;
  }
  for(LL i=1;i<=n;i++){
  	for(LL j=1;j<=m;j++){
  		if(li[j].x-re[i].x>=0&&li[j].y-re[i].y>=0){
  			v[li[j].x-re[i].x]=max(v[li[j].x-re[i].x],(li[j].y-re[i].y+1));	
  			//对于每个横坐标差为x的监控来说,至少需要向上走y步才能出去 
		}	
	}
  }
  LL ans=1e7;LL r=-1e7;
  for(int i=1000000;i>=0;i--){	//注意从大到小,不然会出现不存在的情况当最小值 
    r=max(r,v[i]);///往右走i步时,至少向上需要多少步 
	ans=min(ans,r+i); //加上往右走的步数,枚举总体最小步数 
  }
  cout<<ans<<endl; 
return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/zstuyyyyccccbbbb/article/details/108897449
Recomendado
Clasificación