P3851航运调度

来源:互联网 发布:c语言编程器下载 编辑:程序博客网 时间:2024/05/01 15:20

问题描述

某海域是国际海运枢纽,非常繁忙,N艘船只在航行。航运管理中心一直担心发生船只相撞事件。所以他们想知道,从现在开始,到哪一个时刻,这N艘船两两间的最大距离将达到最小。请你算出这个时刻,并求出这个最小距离。
所有船只都沿直线航行,没有两艘船的前进方向和速度是相同的。

输入格式

第一行,一个整数N(N<=300)
接下来N行,每行四个整数Xi,Yi,VXi,VYi。(Xi,Yi)表示i号船只现在的坐标。VYi,VXi表示i号船的速度和方向。在下一秒,i号船的坐标将是(Xi+VXi,Yi+VYi)
(-10^6 <= Xi, Yi <= 10^6, -10^2 <= VXi , VYi <= 10^2)

输出格式

一行,两个实数,表示所求时间和距离,保留两个小数位

题解

裸三分

代码

#include<stdio.h>#include<algorithm>#include<cstdio>#include<cmath>#include<queue>#include<cstring>#include<iostream>using namespace std;#define maxn 5002#define inf 2e9int a[maxn],b[maxn],c[maxn];int n,m;int dp[maxn][64];bool check(int x){    int i,j;    for( i=0;i<=63;i++){dp[0][i]=m;}    for(i=1;i<=n;i++)    {        if(a[i]==7){            for(j=0;j<=63;j++)            {dp[i][j]=inf;            if(dp[i-1][j]<=x)dp[i][j]=dp[i-1][j]-b[i];}        }        else{            int k=1<<(a[i]-1);            for(j=0;j<=63;j++)            {                dp[i][j]=inf;                if(j&k)                {                    if(dp[i-1][j^k]<=x) dp[i][j]=dp[i-1][j^k]-b[i];                }                else{                    if(dp[i-1][j]<=x)                    {                        dp[i][j]=dp[i-1][j]+c[i];                    }                    if(dp[i-1][j^k]<=x){                        dp[i][j]=min(dp[i][j],dp[i-1][j^k]+c[i]);                    }                }            }        }    }    for(i=0;i<=63;i++) if(dp[n][i]<=x) return true;    return false;}int main(){    int i,j;    scanf("%d",&n);    for(i=1;i<=n;i++) scanf("%d",&a[i]);    for(i=1;i<=n;i++) scanf("%d",&b[i]);    for(i=1;i<=n;i++) scanf("%d",&c[i]);    scanf("%d",&m);     int l=m,r=inf;    while(l<=r){        int mid=(l+r)>>1;        if(check(mid)) r=mid-1;        else l=mid+1;    }    for(i=l-2;;i++) if(check(i)) break;    cout<<i;}
原创粉丝点击