zoukankan      html  css  js  c++  java
  • P1027 [NOIP2001 提高组] Car 的旅行路线

    Aimee

    非常简单

    运用一点点的数学知识算出两两之间的距离

    然后跑最短路

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int xx,yy,xxx,yyy,xxxx,yyyy,xxxxx,yyyyy;
    int su[10001];
    int n;
    double dis[1001][1001];
    struct ci{
    	int x;
    	int y;
    	int id;
    }city[40001];
    int s,t,a,b;
    int  f(int x){
    	return x*x;
    }
    int p;
    void crea(int x,int y,int id){
    	p++;
    	city[p].x=x;
    	city[p].y=y;
    	city[p].id=id;
    }
    double cd(int x,int y){
    	return sqrt(f(city[x].x-city[y].x)+f(city[x].y-city[y].y));
    }
    double mx,my;
    void build(int id){
    	crea(xx,yy,id);	crea(xxx,yyy,id);	crea(xxxx,yyyy,id);
    	int ab=f(xx-xxx)+f(yy-yyy);
    	int ac=f(xx-xxxx)+f(yy-yyyy);
    	int bc=f(xxx-xxxx)+f(yyy-yyyy);
    	if(ab==ac+bc) {
    		mx=(xx+xxx)/2;
    		my=(yy+yyy)/2;
    		xxxxx=2*mx-xxxx;
    		yyyyy=2*my-yyyy;
    	}
    	if(ac==ab+bc) {
    		mx=(xx+xxxx)/2;
    		my=(yy+yyyy)/2;
    		xxxxx=2*mx-xxx;
    		yyyyy=2*my-yyy;
    	}
    	if(bc==ab+ac) {
    		mx=(xxx+xxxx)/2;
    		my=(yyy+yyyy)/2;
    		xxxxx=2*mx-xx;
    		yyyyy=2*my-yy;
    	}
    	crea(xxxxx,yyyyy,id);
    }
    double co(int x,int y){
    	if(city[x].id==city[y].id){
    		return cd(x,y)*su[city[x].id];
    	}else{
    		return cd(x,y)*t;
    	}
    }
    double Aimee;
    int main(){
    	scanf("%d",&n);
    	while(n--){
    		Aimee=99999999.999;
    		scanf("%d%d%d%d",&s,&t,&a,&b);
    		for(int i=1;i<=s;++i){
    			scanf("%d%d%d%d%d%d%d",&xx,&yy,&xxx,&yyy,&xxxx,&yyyy,&su[i]);
    			build(i);
    		}
    	for(int i=1;i<=p;++i){
    		for(int j=i;j<=p;++j){
    			if(i==j)
    			dis[i][j]=dis[j][i]=0;
    			else
    			dis[i][j]=dis[j][i]=co(i,j);
    		}
    	}
    	for(int k=1;k<=p;++k){
    		for(int i=1;i<=p;++i){
    			for(int j=1;j<=p;++j){
    				if(dis[i][k]+dis[k][j]<dis[i][j]){
    					dis[i][j]=dis[i][k]+dis[k][j];
    					if(dis[i][j]==0)
    			return 0;
    				}
    			}
    		}
    	}
    	for(int i=a*4-3;i<=a*4;++i){
    		for(int j=b*4-3;j<=b*4;++j){
    			Aimee=min(Aimee,dis[i][j]);
    		}
    	}
    	printf("%.1lf
    ",Aimee);
    	}
    	return 0;
    }
    
  • 相关阅读:
    TCP流量控制,拥塞控制原理
    Java数组--求一个数组中连续m个数的和最大的数组组合
    一次使用IDEA编写JDK动态代理Class数组中有关泛型的问题
    Java数组--一个整型数组,给定一个定数,求数组中两个数的和与定数相等
    Java基础知识--Stream接口的理解与应用
    JSAP107
    JSAP106
    JSAP105
    JSAP104
    JSAP103
  • 原文地址:https://www.cnblogs.com/For-Miku/p/14382541.html
Copyright © 2011-2022 走看看