当前位置: 首页 > news >正文

PAT 1072 Gas Station

在这里插入图片描述
在这里插入图片描述
这一题的大意是给出N个房子,M个油气站,让我们找到距离各个房子最近的油气站的距离的最大值,和到各个房子距离和的平均值的最小值,以及符合条件的油气站的编号,特别地,如果存在相同的距离各个房子最近的油气站的距离的最大值,那么找到各个房子距离和的平均值的最小值,如果它们的平均值也相同,那么找符合条件的油气站的编号的最小值。
很明显求最短距离用dijkstra算法,只需要求出各个油气站到其他房子的最短距离,跑M遍dijkstra算法即可,在这个过程中,找出每一个油气站到各个房子的最近距离,以及到各个房子的平均距离,然后用每一个油气站的这些参数,来更新找到距离各个房子最近的油气站的距离的最大值如果存在相同的距离各个房子最近的油气站的距离的最大值,那么找到各个房子距离和的平均值的最小值,如果它们的平均值也相同,那么找符合条件的油气站的编号的最小值。
这里我直接用堆优化过的dijkstra,因为它的时间复杂度低,
完整代码如下:

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <unordered_map>
#include <limits.h>
#include <queue>
using namespace std;
int N;
int M; 
int K;
int Ds;
// 1010a
// 1010
int head[1025];
struct node
{int w;int next;int to;
}e[1020125];
int cut;
void add(int x,int y,int w)
{e[cut].w=w;e[cut].next=head[x];e[cut].to=y;head[x]=cut;cut++;
}
int dist[1025];
bool flag[1025];
typedef pair<int,int> pii;
double ans=INT_MAX;
double minnans=INT_MIN;
priority_queue<pii,vector<pii>,greater<pii>> q;
void dijkstra(int s)
{for(int i=0;i<=N+M;i++){dist[i]=INT_MAX;}dist[s]=0;q.push({dist[s],s});while(!q.empty()){pii z=q.top();q.pop();if(flag[z.second]==1){continue;}else{int u=z.second;flag[u]=1;for(int i=head[u];i!=-1;i=e[i].next){int v=e[i].to;if(flag[v]==0&&dist[v]>dist[u]+e[i].w){dist[v]=dist[u]+e[i].w;q.push({dist[v],v});}}}}
}
//N+M
//1000+10=1010
//1010*1010
//1010
//1010
int main()
{//ios::sync_with_stdio(0),cin.tie(0),cout.tie(cin>>N>>M>>K>>Ds;memset(head,-1,sizeof(head));for(int i=0;i<K;i++){string temp1;string temp2;int w;int y;int x;cin>>temp1;cin>>temp2;cin>>w;if(temp1[0]=='G'){string s="";for(int i=1;i<temp1.size();i++){s+=temp1[i];}x=stoi(s)+N;}else{x=stoi(temp1);}if(temp2[0]=='G'){string s="";for(int i=1;i<temp2.size();i++){s+=temp2[i];}y=stoi(s)+N;}else{y=stoi(temp2);}add(x,y,w);add(y,x,w);}//建好了图 bool f=0;int index=-1;double minn=INT_MAX;double avg=0.0;for(int i=M;i>=1;i--){memset(flag,0,sizeof(flag));dijkstra(N+i);double tempans=0.0;f=0;minn=INT_MAX;avg=0.0;   for(int j=1;j<=N;j++){if(dist[j]>Ds){f=1;break;}else{if(minn>dist[j]){minn=dist[j];//最小值 }tempans+=dist[j];}}if(f==1){//说明平均值为 continue; }else{f=0;avg=tempans/N;//算出来了平均值if(minnans<minn){minnans=minn;ans=avg;index=i;//	cout<<minnans<<" "<<ans<<" "<<index<<endl; }else if(minnans==minn){if(ans>avg){minnans=minn;ans=avg;index=i;//cout<<minnans<<" "<<ans<<" "<<index<<endl;}else if(ans==avg){index=i;}}		  }}if(index==-1){cout<<"No Solution";}else{printf("G%d\n",index);printf("%.1f %.1f",minnans,ans);}return 0;} 

存在的坑:1.油气站的编号既包含英文又包含数字,所以应该用字符串来存储,然后把这个字符串转化成合适的数值,编号有M个,所以把这M放到N的后面,即N+1-N+M,转换方法:

	    string temp1;string temp2;int w;int y;int x;cin>>temp1;cin>>temp2;cin>>w;if(temp1[0]=='G'){string s="";for(int i=1;i<temp1.size();i++){s+=temp1[i];}x=stoi(s)+N;}else{x=stoi(temp1);}if(temp2[0]=='G'){string s="";for(int i=1;i<temp2.size();i++){s+=temp2[i];}y=stoi(s)+N;}else{y=stoi(temp2);}

注意M是<=10,因此需要用到stoi来转换,而不是一个字符一个字符的转换成数字。
题目上给出的第一个测试用例存在错误,不用四舍五入,应该为

G1
2.0 3.2

而不是

G1
2.0 3.3

总结:这一题的主要是考察dijkstra,但过程中的细节很多,需要对字符串的操作等很熟悉,更关键的是要读懂题意,因为是英文题面,有时候理解有偏差,我刚开始就理解不到位,导致有两个测试点不过
在这里插入图片描述
原因是我没有理解到题意的说法,当平均值相同的时候,找编号小的油气站

else if(ans==avg){index=i;}

刚开始的时候对题意的不理解走了很多弯路,实际的题目不是很难。
还有要注意数组一定要开的合适

http://www.dtcms.com/a/339687.html

相关文章:

  • visionpro获取电脑cpu序列号
  • 生信分析自学攻略 | R语言数据类型和数据结构
  • 矿物分类系统开发笔记(二):模型训练[删除空缺行]
  • leetcode2248. 多个数组求交集
  • ES支持哪些数据类型,和MySQL之间的映射关系是怎么样的?
  • Vue3 学习教程,从入门到精通,vue3综合案例:“豪华版”待办事项(41)
  • [Polly智能维护网络] 网络重试原理 | 弹性策略
  • PyTorch数据处理工具箱(utils.data简介)
  • UE5 PCG 笔记(一)
  • C++ STL(标准模板库)学习
  • 华为鸿蒙系统SSH如何通过私钥连接登录
  • 传统概率信息检索模型:理论基础、演进与局限
  • 短剧小程序系统开发:打造沉浸式短剧观影体验
  • EPM240T100I5N Altera FPGA MAX II CPLD
  • Spring Cache 整合 Redis 实现高效缓存
  • idea如何设置tab为4个空格
  • 复习登录校验流程:会话跟踪技术与请求拦截方案详解
  • SpringBoot-集成POI和EasyExecl
  • 《Light Sci Appl》突破:vdW材料实现亚波长光学涡旋生成,转换效率达46%
  • 前端基础知识操作系统系列 - 01(操作系统的理解?核心概念有哪些)
  • Spring Ai Prompts
  • 佰力博检测与您探讨电晕极化时有时会击穿是什么原因
  • 海洋牧场智能化监控系统升级,保障养殖安全
  • Web3.0 时代的电商系统:区块链如何解决信任与溯源问题?
  • 嵌入式系统学习Day19(数据结构)
  • 用poll改写select
  • 网站频繁遭遇SQL注入、XSS攻击该怎么办?
  • 分布式搜索(Elasticsearch)深入用法
  • git 创用操作
  • java快速接入mcp以及结合mysql动态管理