浙大PAT 1072题 1072. Gas Station

2024-02-26 22:08
文章标签 浙大 pat 1072 gas station

本文主要是介绍浙大PAT 1072题 1072. Gas Station,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

/*
本题的题意开始没有理解,以为最优的第一条件就是平均值最小,但不是这样的。
第一条件:所有候选点中到house最小值最大的那个候选点,第一个测试用例中G1的最小值为2,
G2的最小值为1,G3的最小值为2,所以选取候选点G1和G3继续比较;
4 2 4 3
3 1 3 4
5 3 2 4
G1
2.0 3.3
第二条件:平均值最小,第一个测试用例中,G1的平均值小于G3,所以最优解为G3;
第三条件:序号最小;
*/
#include<stdio.h>
#include<string.h>
#define Inf 1<<30
int n,m,k,d;
int map[1100][1100],vst[1100],dis[1100];
typedef struct{int total;int imin;int mark;
}Node;
Node node[20];
void Dijstra(int index){int i,j,k,imax;dis[index]=0;for(i=1;i<n+m;i++){imax=Inf;for(j=1;j<=1000+m;j++){if(!vst[j]&&dis[j]<imax){imax=dis[j];k=j;}if(j==n) j=1000;}vst[k]=1;for(j=1;j<=1000+m;j++){if(!vst[j]){if(dis[k]+map[k][j]<dis[j]){dis[j]=dis[k]+map[k][j];}}if(j==n) j=1000;}}}
int main(){int i,j,dist;char from[10],to[10];int fsum,tsum,tmp;scanf("%d %d %d %d",&n,&m,&k,&d);for(i=1;i<=1010;i++){for(j=1;j<=1010;j++){map[i][j]=Inf;}}for(i=0;i<k;i++){scanf("%s %s %d",from,to,&dist);int lenf=strlen(from);tmp=1;if(from[0]=='G'){fsum=1000+from[lenf-1]-'0';for(j=lenf-2;j>=1;j--){tmp=tmp*10;fsum=fsum+(from[j]-'0')*tmp;}}else{fsum=from[lenf-1]-'0';for(j=lenf-2;j>=0;j--){tmp=tmp*10;fsum=fsum+(from[j]-'0')*tmp;}}int lent=strlen(to);tmp=1;if(to[0]=='G'){tsum=1000+to[lent-1]-'0';for(j=lent-2;j>=1;j--){tmp=tmp*10;tsum=tsum+(to[j]-'0')*tmp;}}else{tsum=to[lent-1]-'0';for(j=lent-2;j>=0;j--){tmp=tmp*10;tsum=tsum+(to[j]-'0')*tmp;}}//printf("%d %d\n",fsum,tsum);map[fsum][tsum]=map[tsum][fsum]=dist;}int rtotal,rmin,flag;for(i=1001;i<=1000+m;i++){for(j=1;j<=1010;j++){vst[j]=0;dis[j]=Inf;}Dijstra(i);//for(j=1;j<=n;j++)//printf("%d ",dis[j]);//printf("\n");flag=0;rtotal=0;for(j=1;j<=n;j++){if(dis[j]<=d){rtotal=rtotal+dis[j];}else{flag=1;}}if(flag){node[i-1000].mark=0;}else{node[i-1000].mark=1;node[i-1000].total=rtotal;rmin=Inf;for(j=1;j<=n;j++){if(dis[j]<rmin)rmin=dis[j];}node[i-1000].imin=rmin;}}int rindex=-1,maxmin=-1,maxtotal=Inf;for(i=1;i<=m;i++){if(node[i].mark){if(node[i].imin>maxmin){maxmin=node[i].imin;maxtotal=node[i].total;rindex=i;}else if(node[i].imin==maxmin){if(node[i].total<maxtotal){maxtotal=node[i].total;rindex=i;}}}}if(rindex==-1){printf("No Solution\n");}else{printf("G%d\n",rindex);printf("%.1f %.1f\n",node[rindex].imin*1.0,node[rindex].total*1.0/n);}return 0;
}

这篇关于浙大PAT 1072题 1072. Gas Station的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750308

相关文章

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre

浙大数据结构:04-树7 二叉搜索树的操作集

这道题答案都在PPT上,所以先学会再写的话并不难。 1、BinTree Insert( BinTree BST, ElementType X ) 递归实现,小就进左子树,大就进右子树。 为空就新建结点插入。 BinTree Insert( BinTree BST, ElementType X ){if(!BST){BST=(BinTree)malloc(sizeof(struct TNo

nyoj 1072 我想回家

一道相当题目描述相当扯的题。 这道题目的描述最后说的是求出到达最后一个点的最短距离,所以输入数据最后输入的城堡的坐标是没用的。 就是先求出两点之间的距离,若不大于村落间距离,并且不大于最后的距离限制 l ,则在两点间建边。 最后任意方法求出最短路即可。 #include <iostream>#include<stdio.h>#include<vector>#include<

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

浙大数据结构——03-树1 树的同构

这道题我依然采用STL库的map,从而大幅减少了代码量 简单说一下思路,两棵树是否同构,只需比较俩树字母相同的结点是否同构,即是否左==左,右==右或者左==右,右==左。 1、条件准备 atree和btree是存两个数结点字母,第几个就存输入的第几个结点的字母。 map通过结点的字母作为键,从而找到两个子节点的信息 都要用char类型 #include <iostream>#inc

浙大数据结构:堆栈和队列的定义与操作

堆栈: 顺序存储: #include<stdio.h>#include<stdlib.h>typedef int ElementType ;typedef int position ;#define MAXSIZE 100#define ERROR -1struct SNode {ElementType * Data ;position top;int Maxsize;};

PAT甲级-1044 Shopping in Mars

题目   题目大意 一串项链上有n个钻石,输入给出每个钻石的价格。用m元买一个连续的项链子串(子串长度可为1),如果不能恰好花掉m元,就要找到最小的大于m的子串,如果有重复就输出多个,按递增顺序输出子串的前端和后端索引。 原来的思路 取连续的子串使和恰等于m,没有恰等于就找最小的大于。可以将子串依次累加,使得每个位置都是起始位置到该位置的序列和,整个数组显递增顺序,就可以用右边减左边

PAT (Advanced Level) Practice——1011,1012

1011:  链接: 1011 World Cup Betting - PAT (Advanced Level) Practice (pintia.cn) 题意及解题思路: 简单来说就是给你3行数字,每一行都是按照W,T,L的顺序给出相应的赔率。我们需要找到每一行的W,T,L当中最大的一个数,累乘的结果再乘以0.65,按照例子写出表达式即可。 同时还需要记录每一次选择的是W,T还是L

【SGU】 114. Telecasting station 中位数

传送门:【SGU】 114. Telecasting station 题目分析:一个位置多个城市可以看成多个城市在同一位置,然后就可以求中位数了,易知最优的位置一定在中位数上。 代码如下 : #include <map>#include <vector>#include <cstdio>#include <cstring>#include <iostream>

浙大数据结构:01-复杂度2 Maximum Subsequence Sum

数据结构MOOC PTA习题 01-复杂度2 Maximum Subsequence Sum #include <iostream>using namespace std;const int M = 100005;int a[M];int main(){int k;cin >> k;int f = 1;for (int i = 0; i < k; i++){cin >> a[i