【PAT甲级】1072 Gas Station (30 分)(Dijkstra)

题意:

输入四个正整数N,M,K,D(N<=1000,M<=10,K<=10000)分别表示房屋个数,加油站个数,路径条数和加油站最远服务距离,接着输入K行每行包括一条路的两条边和距离。输出最近距离最远同时与所有房屋距离都不超过D的加油站名字和最近距离以及平均距离。如果有多个答案则优先输出平均距离最小的,再不唯一则输出编号最小的。

trick:

这题有一个诡异的事情,样例1的平均距离是3.25,取一位小数应该是3.2,四舍五入则是3.3,样例显示为3.3,此时我理解为四舍五入,题面说是精确到1位小数。

当我将ans+0.05时测试点4会不过,当我直接舍入时AC样例却输出3.2。🤔。。。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 vector<pair<int,int> >edge[1017];
 5 int dis[1017],vis[1017];
 6 int sum[17],mnn[17],mxx[17];
 7 void Dijkstra(int x){
 8     dis[x]=0;
 9     priority_queue<pair<int,int> >pq;
10     pq.push({0,x});
11     while(!pq.empty()){
12         int now=pq.top().second;
13         pq.pop();
14         if(vis[now])
15             continue;
16         vis[now]=1;
17         for(int i=0;i<edge[now].size();++i){
18             int v=edge[now][i].first;
19             if(!vis[v]&&dis[v]>dis[now]+edge[now][i].second){
20                 dis[v]=dis[now]+edge[now][i].second;
21                 pq.push({-dis[v],v});
22             }
23         }
24     }
25 }
26 int main(){
27     for(int i=1;i<=10;++i)
28         mnn[i]=1e9+7;
29     int n,m,k,d;
30     scanf("%d%d%d%d",&n,&m,&k,&d);
31     for(int i=1;i<=k;++i){
32         int u=0,v=0,w;
33         char s1[5],s2[5];
34         scanf("%s%s%d",s1,s2,&w);
35         if(s1[0]=='G')
36             if(s1[2]=='0')
37                 u=1010;
38             else
39                 u=1000+s1[1]-'0';
40         else
41             for(int j=0;j<strlen(s1);++j){
42                 u*=10;
43                 u+=s1[j]-'0';
44             }
45         if(s2[0]=='G')
46             if(s2[2]=='0')
47                 v=1010;
48             else
49                 v=1000+s2[1]-'0';
50         else
51             for(int j=0;j<strlen(s2);++j){
52                 v*=10;
53                 v+=s2[j]-'0';
54             }
55         edge[u].push_back({v,w});
56         edge[v].push_back({u,w});
57     }
58     int mn=0,pos=0,mnnn=0;
59     for(int i=1;i<=m;++i){
60         for(int j=1;j<=1010;++j)
61             dis[j]=1e9+7,vis[j]=0;
62         Dijkstra(i+1000);
63         for(int j=1;j<=n;++j){
64             sum[i]+=dis[j];
65             mnn[i]=min(mnn[i],dis[j]);
66             mxx[i]=max(mxx[i],dis[j]);
67         }
68         if(mxx[i]<=d&&mnn[i]>=mnnn)
69             if(mnn[i]>mnnn){
70                 mn=sum[i];
71                 pos=i;
72                 mnnn=mnn[i];
73             }
74             else if(mnn[i]==mnnn&&sum[i]<mn){
75                 mn=sum[i];
76                 pos=i;
77             }
78     }
79     double ans=1.0*mn/n;
80     if(pos){
81         printf("G%d\n",pos);
82         printf("%d.0 %.1lf",mnnn,ans);
83     }
84     else
85         printf("No Solution");
86     return 0;
87 }

 

 

 

posted @ 2019-11-05 15:42  sewage  阅读(507)  评论(1编辑  收藏  举报