CodeForces

题目链接: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;
}
原文地址:https://www.cnblogs.com/zcb123456789/p/13786413.html