hihoCoder1678 版本号排序

#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\n",a[i].s);
    return 0;
}
View Code

 

posted @ 2018-01-07 21:12  ACRykl  阅读(551)  评论(0编辑  收藏  举报