D. Searchlights(思維+列舉距離)

小菜雞加油發表於2020-10-01

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

思路:

有很多人和很多監控,考慮列舉。

考慮將橫縱座標分開考慮。

先在有效工作的監控中列舉。

考慮對於每個橫座標差為x的監控來說,對應的和監控橫座標差為x的人至少需要向上走y步才能逃離。

然後再來列舉向右走的步數從最大的1e6到0中,能走出來的的向上走+向右走的最小值是多少。

#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;
}

 

相關文章