程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu_4170 Supply Mission (計算幾何)

hdu_4170 Supply Mission (計算幾何)

編輯:C++入門知識

題意:
飛機在位置(x0,y0),飛行速度為v km/h,有N(0<N<8)艘船分別為(xi,yi)速度向量為(vxi,vyi) km/h,坐標單位為km
飛機必須在每艘船上要一小時卸載貨物,最後飛回原來的位置(x0,y0),求最少時間花費,用時分秒輸出。
思路:
想了會兒,沒什麼思路,看了看數據范圍,N最大才8,時限10秒,完全可以暴力嘛。
直接把到達船的順序做個全排列,取最小的一次時間就行了,算相遇時要一定要細心。
還有個小trick,秒進位後等於60,這裡搞了我好久好久。。。
[cpp] 
/*
program:hdu_4170 & hunnu_11215
author:BlackAndWhite
*/ 
#include<stdio.h> 
#include<math.h> 
#include<algorithm> 
#define eps 1e-6 
using namespace std; 
struct point 

    int x,y; 
}a[10],v[10],s; 
double t,ans; 
int N,sv,i,p[10],T[3],js=1; 
double crosstime(double x0,double y0,double v0,double x1,double y1,double vx,double vy) 
{//表示飛機在(x0,y0),速度為v0,要與船(x1,y1)速度向量為(vx,vy)相遇所花費的時間。  
    double a,b,c,t; 
    a=vx*vx+vy*vy-v0*v0; 
    b=2*(vx*(x1-x0)+vy*(y1-y0)); 
    c=(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0); 
    if(a<eps&&a>-eps) return -c/b; 
    if(a<eps) {a=-a;b=-b;c=-c;} 
    return (-b+sqrt(b*b-4*a*c))/(2*a); 

double back(double x0,double y0,double x1,double y1,double sv)//最後回到起點的時間花費  

    return sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0))/sv; 

void trs(double ans,int T[3])//小數形式轉換為時分秒  

    T[0]=(int)ans; 
    ans-=T[0]; 
    T[1]=(int)(ans*=60.0);ans-=T[1]; 
    T[2]=(int)(ans*60.0+0.9999999); 
    if(T[2]==60) {T[2]=0;T[1]++;}//trick,進位啊。。。  
    if(T[1]==60) {T[1]=0;T[0]++;} 

int main() 

    while(scanf("%d",&N),N) 
    { 
        for(i=0;i<N;i++) scanf("%d%d%d%d",&a[i].x,&a[i].y,&v[i].x,&v[i].y); 
        scanf("%d%d%d",&s.x,&s.y,&sv); 
        for(i=0;i<=N;i++) p[i]=i; 
        ans=1e9; 
        do 
        { 
            t=crosstime(s.x*1.0,s.y*1.0,sv*1.0,a[p[0]].x,a[p[0]].y,v[p[0]].x,v[p[0]].y)+1.0; 
            for(i=1;i<N;i++)//當前在p[i-1]船上准備出發瞬間,p[i-1]船已經行駛t小時 ,p[i]船同樣行駛t小時  
                t+=1.0+crosstime(a[p[i-1]].x*1.0+t*v[p[i-1]].x,a[p[i-1]].y*1.0+t*v[p[i-1]].y,sv*1.0,a[p[i]].x*1.0+t*v[p[i]].x,a[p[i]].y*1.0+t*v[p[i]].y,v[p[i]].x*1.0,v[p[i]].y*1.0); 
            t+=back(a[p[N-1]].x*1.0+t*v[p[N-1]].x,a[p[N-1]].y*1.0+t*v[p[N-1]].y,s.x,s.y,sv); 
            if(t<ans) ans=t; 
        } 
        while(next_permutation(p,p+N)); 
        trs(ans,T); 
        printf("Case %d: %d hour(s) %d minute(s) %d second(s)\n",js++,T[0],T[1],T[2]); 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved