浙大PAT 1072题 1072. Gas Station
2014-02-24 20:26
274 查看
/* 本题的题意开始没有理解,以为最优的第一条件就是平均值最小,但不是这样的。 第一条件:所有候选点中到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; }
相关文章推荐
- VC一些经验系列: 《分享泄漏检测工具:内存、DC、GDI、Handle... 》
- boost线程库学习--(4)两个线程间使用队列进行通信
- 扩展方法
- javaSE-面向对象-static关键字
- 你是清寒,却上心头
- 自学Linux命令-----(1)
- shared_ptr:资源管理利器
- java算法买苹果
- UNIX Domain Socket IPC
- 如何判断自己是否具有成为一名优秀程序员的潜质
- opencv
- nginx---stubstatus
- 关于sdk烧写elf文件问题
- The resource identified by this request is only capable of generating responses with characteristics
- 第一天 悲催的遗留项目
- MIPI的走线阻抗
- hadoop 2.2.0 执行MapReduce程序
- [复变函数]第04堂课 1. 3 复变函数
- golang test说明解读
- ANTEX: The Antenna Exchange Format, Version 1.4