zoukankan      html  css  js  c++  java
  • pat1072 Gas Station

    这道题是求M个候选点到N个house的最短路,从M个点中选符合条件的一个点。题目不难,由于没处理好几个细节,导致了很多bug。一开始wa以为是卡在int没有用longlong,但改完发现的其他bug后就A了,看来pat不会故意在数据大小上卡。

    bug如下:

    1、节点标号使用字符串读,转换为整数时只转换了一位,没有考虑到多位的情况。

    2、求距离之和时sum的初始化放在了for循环的外面,应该放在for循环的第一句,否则只有第一个求的正确,后面的会累加。

    3、求最小值该用>的地方写成<。

    4、这个是最隐蔽的bug,题目说要保证候选点到house的距离in its service range,这里应该用<=,写成<,导致第一个case都没过。将题意转换成代码时没有转换正确。真是细节决定成败啊。

    附代码:

      1 //pat1072 Gas Station
      2 #include<stdio.h>
      3 #include <stdlib.h>
      4 #include <string>
      5 #include <iostream>
      6 using namespace std;
      7 //总节点数
      8 #define MAXN 1100
      9 #define inf 2000000000
     10 struct Candidate
     11 {
     12     int min,max;
     13     double average;
     14 }candidate[15];
     15 int map[MAXN][MAXN],Min[MAXN];
     16 //所有节点数=N+M,包含候选点,0到M-1为候选点,M到n-1为house
     17 int n;
     18 
     19 void dijkstra(int s,int* min)
     20 {
     21     int v[MAXN],i,j,k;
     22     for (i=0;i<n;i++)
     23     {min[i]=inf,v[i]=0;}
     24     for (min[s]=0,j=0;j<n;j++)
     25     {
     26         //找距离最小的点,最初为源点
     27         for (k=-1,i=0;i<n;i++)
     28         {
     29             if (!v[i]&&(k==-1||min[i]<min[k]))
     30                 k=i;
     31         }
     32         //比较从经过该点到其他点的距离与当前最小距离,更新当前最小距离
     33         for (v[k]=1,i=0;i<n;i++)
     34         {
     35             if (!v[i]&&min[k]+map[k][i]<min[i])
     36                 min[i]=min[k]+map[k][i];
     37         }
     38     }
     39 }
     40 int char2int(char* p,int M)
     41 {
     42     int ans=0,j;
     43     if(p[0]=='G')
     44     {
     45         j=1;
     46         while(p[j]!='')
     47         {
     48             ans=ans*10+p[j]-'0';
     49             j++;
     50         }
     51         ans--;
     52     }
     53     else
     54     {
     55         j=0;
     56         while(p[j]!='')
     57         {
     58             ans=ans*10+p[j]-'0';
     59             j++;
     60         }
     61         ans=ans+M-1;
     62     }
     63     return ans;
     64 }
     65 int main()
     66 {
     67     int i,j,N,M,K,Ds;
     68     char p1[10],p2[10];
     69     while(scanf("%d%d%d%d",&N,&M,&K,&Ds)!=EOF)
     70     {
     71         n=N+M;
     72         int dist,left,right;
     73         for(i=0;i<n;i++)
     74         {
     75             for(j=i+1;j<n;j++)
     76             map[i][j]=map[j][i]=inf;
     77         }
     78         for(i=0;i<K;i++)
     79         {
     80             scanf("%s%s%d",p1,p2,&dist);
     81             left=right=0;
     82             left=char2int(p1,M);
     83             right=char2int(p2,M);
     84             map[left][right]=map[right][left]=dist;
     85         }
     86         //求各个候选点到所有house的距离,记录最大值和最小值
     87         int sum=0;
     88         for(i=0;i<M;i++)
     89         {
     90             candidate[i].min=inf;
     91             candidate[i].max=0;
     92         }
     93         for(i=0;i<M;i++)
     94         {
     95             dijkstra(i,Min);
     96             sum=0;
     97             for(j=M;j<n;j++)
     98             {
     99                 if(j==M||Min[j]<candidate[i].min)
    100                 candidate[i].min=Min[j];
    101                 if(j==M||Min[j]>candidate[i].max)
    102                 candidate[i].max=Min[j];
    103                 sum+=Min[j];
    104             }
    105             candidate[i].average=(sum+0.0)/N;
    106         }
    107         //在最大值小于等于Ds的情况下找最小值最大的
    108         int ans=-1;
    109         for(i=0;i<M;i++)
    110         {
    111             if(candidate[i].max<=Ds)
    112             {
    113                 if(ans==-1||candidate[i].min>candidate[ans].min)
    114                 {
    115                     ans=i;
    116                 }
    117                 else if(candidate[i].min==candidate[ans].min&&candidate[i].average<candidate[ans].average)
    118                 {
    119                     ans=i;
    120                 }
    121             }
    122         }
    123         if(ans==-1)
    124         printf("No Solution
    ");
    125         else
    126         printf("G%d
    %.1f %.1f
    ",ans+1,candidate[ans].min+0.0,candidate[ans].average);
    127     }
    128 
    129     return 0;
    130 }
    View Code
  • 相关阅读:
    POJ 1330 Nearest Common Ancestors(LCA Tarjan算法)
    LCA 最近公共祖先 (模板)
    线段树,最大值查询位置
    带权并查集
    转负二进制
    UVA 11437 Triangle Fun
    UVA 11488 Hyper Prefix Sets (字典树)
    UVALive 3295 Counting Triangles
    POJ 2752 Seek the Name, Seek the Fame (KMP)
    UVA 11584 Partitioning by Palindromes (字符串区间dp)
  • 原文地址:https://www.cnblogs.com/mascure/p/3485410.html
Copyright © 2011-2022 走看看