zoukankan      html  css  js  c++  java
  • CF #327 DIV2 D、E

    两题都不难。

    对于D题,可以使用相对移动,把吹aircraft移动变成相反方向的待援点的移动。假设此时时间为t,把aircraft的速度设为Vmax,看待援点在飞船最大速度飞行t秒的范围内,注意风向变化的时间点即可。其实很明显的二分。。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 
     6 using namespace std;
     7 int x1,y1,x2,y2;
     8 double v,t;
     9 int fx,fy,sx,sy;
    10 
    11 double dis(double x,double y){
    12     return x*x+y*y;
    13 }
    14 
    15 bool ok(double st){
    16     if(st<=t){
    17         if(dis(x2-fx*st-x1,y2-fy*st-y1)-v*st*v*st>1e-8) return false;
    18         else return true;
    19     }
    20     else{
    21         st-=t;
    22         if(dis(x2-fx*t-sx*st-x1,y2-fy*t-sy*st-y1)-v*v*(st+t)*(st+t)>1e-8) return false;
    23         return true;
    24     }
    25 }
    26 
    27 int main(){
    28     while(scanf("%d%d%d%d",&x1,&y1,&x2,&y2)!=EOF){
    29         scanf("%lf%lf",&v,&t);
    30         scanf("%d%d%d%d",&fx,&fy,&sx,&sy);
    31         double l=0,r=1e9;
    32         double ans=0;
    33         while(r-l>1e-8){
    34             double m=(r+l)/2;
    35             if(ok(m)){
    36                 ans=m;
    37                 r=m;
    38             }
    39             else{
    40                 l=m;
    41             }
    42         }
    43         printf("%.8lf
    ",ans);
    44     }
    45     return 0;
    46 }
    View Code

    对于E题,我觉得我是傻B了。可以求出每个国家到其他国家的最近距离,当然了,此时使用BFS,求出每个点到从本国的边缘点出发的最近距离。

    首先假设交接点在某个国家,这样求三次都取最近距离。

    再假设交接点在空白的点上,取某点到三个国家最近的距离和。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <queue>
     6 
     7 using namespace std;
     8 
     9 char str[1005][1005];
    10 int n,m;
    11 int dis[4][1005][1005];
    12 
    13 struct Node{
    14     int x,y;
    15     Node(){}
    16     Node(int xx,int yy){
    17         x=xx,y=yy;
    18     }
    19 };
    20 
    21 int dir[4][2]={
    22     {0,1},
    23     {1,0},
    24     {-1,0},
    25     {0,-1}
    26 };
    27 
    28 int p[4];
    29 
    30 bool ok(int x,int y){
    31     if(x<1||x>n||y<1||y>m) return false;
    32     return true;
    33 }
    34 
    35 void slove(int ind){
    36     queue<Node>que;
    37     for(int i=1;i<=n;i++){
    38         for(int j=1;j<=m;j++){
    39             if(str[i][j]=='0'+ind)
    40                 que.push(Node(i,j)),dis[ind][i][j]=0,p[ind]=0;
    41         }
    42     }
    43     Node tmp,nxt;
    44     while(!que.empty()){
    45         tmp=que.front();
    46         que.pop();
    47         for(int k=0;k<4;k++){
    48             nxt.x=tmp.x+dir[k][0];
    49             nxt.y=tmp.y+dir[k][1];
    50             if(!ok(nxt.x,nxt.y)) continue;
    51             if(dis[ind][nxt.x][nxt.y]!=-1) continue;
    52             if(str[nxt.x][nxt.y]=='#') continue;
    53             dis[ind][nxt.x][nxt.y]=dis[ind][tmp.x][tmp.y]+1;
    54             if(str[nxt.x][nxt.y]>='1'&&str[nxt.x][nxt.y]<='3'){
    55                 if(str[nxt.x][nxt.y]=='1'&&p[1]==-1) p[1]=dis[ind][nxt.x][nxt.y];
    56                 if(str[nxt.x][nxt.y]=='2'&&p[2]==-1) p[2]=dis[ind][nxt.x][nxt.y];
    57                 if(str[nxt.x][nxt.y]=='3'&&p[3]==-1) p[3]=dis[ind][nxt.x][nxt.y];
    58             }
    59             que.push(Node(nxt.x,nxt.y));
    60         }
    61     }
    62 }
    63 
    64 int main(){
    65     while(scanf("%d%d",&n,&m)!=EOF){
    66         for(int i=1;i<=n;i++){
    67             scanf("%s",str[i]+1);
    68         }
    69         int ans=-1;
    70         memset(dis[1],-1,sizeof(dis[1]));
    71         memset(p,-1,sizeof(p));
    72         slove(1);
    73         if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1) ans=ans==-1?p[1]+p[2]+p[3]-2:min(ans,p[1]+p[2]+p[3]-2);
    74         memset(dis[2],-1,sizeof(dis[2]));
    75         memset(p,-1,sizeof(p));
    76         slove(2);
    77         if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1) ans=ans==-1?p[1]+p[2]+p[3]-2:min(ans,p[1]+p[2]+p[3]-2);
    78         memset(dis[3],-1,sizeof(dis[3]));
    79         memset(p,-1,sizeof(p));
    80         slove(3);
    81         if(p[1]!=-1&&p[2]!=-1&&p[3]!=-1) ans=ans==-1?p[1]+p[2]+p[3]-2:min(ans,p[1]+p[2]+p[3]-2);
    82         for(int i=1;i<=n;i++){
    83             for(int j=1;j<=m;j++){
    84                 if(dis[1][i][j]==-1) continue;
    85                 if(dis[2][i][j]==-1) continue;
    86                 if(dis[3][i][j]==-1) continue;
    87                 ans=ans==-1?dis[1][i][j]+dis[2][i][j]+dis[3][i][j]-2:min(ans,dis[1][i][j]+dis[2][i][j]+dis[3][i][j]-2);
    88             }
    89         }
    90         printf("%d
    ",ans);
    91         
    92     }
    93     return 0;
    94 }
    View Code
  • 相关阅读:
    C# 不用添加WebService引用,调用WebService方法
    贪心 & 动态规划
    trie树 讲解 (转载)
    poj 2151 Check the difficulty of problems (检查问题的难度)
    poj 2513 Colored Sticks 彩色棒
    poj1442 Black Box 栈和优先队列
    啦啦啦
    poj 1265 Area(pick定理)
    poj 2418 Hardwood Species (trie树)
    poj 1836 Alignment 排队
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4924464.html
Copyright © 2011-2022 走看看