http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=570&pid=1001
官方题解:
对于输入的每一行一两个整数作差,按照差值从大到小排序,如果差值一样,按照后面的整数从小到大排序,如果还是一样按照ID从小到大排序。
首先注意下数据范围,大约100组数据,所有整数都在[1,100] 的范围内,即使是用冒泡法或者选择法排序也不会TLE。其次就要考虑如何将城市的标号一并排序,可以构建一个专门保存城市标号的数组,排序的时候按城市标号对应的数据进行比较,只改变城市标号的位置,数据不用排序。、
先贴一个最简单的代码。
#include<stdio.h> int main() { int i,j,n,pm[110][2],c[110],t,s[110]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d%d",&pm[i][0],&pm[i][1]); c[i]=pm[i][0]-pm[i][1]; s[i]=i; //s数组记录城市的标号 } for(i=0;i<n-1;i++) //首先按照差值排序,注意只是将城市的标号排序 { for(j=0;j<n-1-i;j++) { if(c[s[j]]<c[s[j+1]]) { t=s[j]; s[j]=s[j+1]; s[j+1]=t; } } } for(i=0;i<n-1;i++) //按照第二次的测量值升序排序,同样将城市的标号排序 { if(c[s[i]]==c[s[i+1]]) { if(pm[s[i]][1]>pm[s[i+1]][1]) { t=s[i]; s[i]=s[i+1]; s[i+1]=t; if(i>0) i=i-2; } } } for(i=0;i<n-1;i++) //按照输入的顺序排序 { if(c[s[i]]==c[s[i+1]]) { if(pm[s[i]][1]==pm[s[i+1]][1]) { if(s[i]>s[i+1]) { t=s[i]; s[i]=s[i+1]; s[i+1]=t; if(i>0) i=i-2; } } } } for(i=0;i<n;i++) { if(i==0) printf("%d",s[i]); else printf(" %d",s[i]); } printf("\n"); } return 0; }
赛后觉得时间用的太多,发现可以用一个结构体将数据保存,用sort函数排序,只要写一下cmp函数。
代码如下:
原文:http://www.cnblogs.com/yaoyueduzhen/p/BestCoder32_1001.html