CodeForces - 1408D
题目链接:https://codeforces.com/problemset/problem/1408/D
题意:有n个海盗,m个灯塔,如果海盗的x坐标和y坐标分别小于等于某个灯塔的x坐标和y坐标,那该海盗就会被该灯塔照射。你每次操作可以使所有的海盗x+1,或者y+1,问最少进行多少次操作后,所有的海盗都不会被灯塔照射。
思路:设dp[i]表示海盗向右走i步后还需要向上走dp[i]步才不会被灯塔照射到,然后再逆序遍历向右走的步数,更新向上走的步数,和答案即可。
#include<cmath> #include<cstring> #include<vector> #include<cstdio> #include<iostream> #include<algorithm> using namespace std; const double Pi=acos(-1.00); int dp[1000006]; struct node { int x,y; }a[2005],b[2005]; int main() { int n,m; cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y; for(int i=1;i<=m;i++) cin>>b[i].x>>b[i].y; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { if(a[i].x<=b[j].x&&a[i].y<=b[j].y) dp[b[j].x-a[i].x]=max(dp[b[j].x-a[i].x],b[j].y-a[i].y+1); } } int sum=0,ans=1000006; for(int i=1000000;i>=0;i--) { sum=max(sum,dp[i]); ans=min(ans,i+sum); } cout<<ans<<endl; }