#1678 : 版本号排序
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
小Hi在一家互联网巨头公司实习。他发现由于公司不同的部门实在太多了,导致使用的一些开发工具和软件库的版本非常不统一、五花八门。
比如一款工具就有2.96, 3.4.5, 4.8.2, 6.4和7.2几种不同的版本。
现在给出了N个版本号,请你帮助小Hi把这些版本号从旧到新排序。
版本号格式都是若干由'.'连接起来的非负整数。比较版本号新旧时先主版本号(最左的整数)开始,再比较次版本号(第二个整数),以此类推……。
例如2.96 < 3.4.5 < 4.8.2 < 4.8.4 < 4.13 < 6.4 < 7.2
特别的,我们认为NULL小于0,也即1.0 < 1.0.0,4.8.2 < 4.8.2.0。
输入
第一行包含一个整数N。 (1 ≤ N ≤ 100)
以下N行每行一个版本号。 版本号总长度不超过100,主版本号和每个子版本号的数值不超过100
输出
N行,每行一个版本号,从旧到新排列。
- 样例输入
-
9 4.8 4.8.2 7.2 2.96 3.4.5 1.0 2 6.4 1.0.0
- 样例输出
-
1.0 1.0.0 2 2.96 3.4.5 4.8 4.8.2 6.4 7.2
分析:刚开始直接排序,后来发现不对,考虑12<8.0,
数据量比较小,直接暴力。#include<cstdio> #include<algorithm> using namespace std; struct Node{ char s[200]; int num; int sum[110]; }a[20000]; int cmp(Node A,Node B) { int n=min(A.num,B.num); for(int i=0;i<=n;i++) { if(A.sum[i]==B.sum[i]) continue; else if(A.sum[i]>B.sum[i]) return 0; else return 1; } if(A.num>B.num) return 0; return 1; } int main() { int N; scanf("%d",&N); for(int i=0;i<N;i++) { scanf("%s",a[i].s); int j=0,temp=0; a[i].num=0; while(a[i].s[j]) { if(a[i].s[j]=='.') { a[i].sum[a[i].num++]=temp; temp=0; } else temp=temp*10+a[i].s[j]-'0'; j++; } a[i].sum[a[i].num]=temp; } sort(a,a+N,cmp); for(int i=0;i<N;i++) printf("%s ",a[i].s); return 0; }