【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 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)