码迷,mamicode.com
首页 > 编程语言 > 详细

例题1.17 年龄排序 UVa11462

时间:2015-08-15 18:23:54      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:

1.题目描述:点击打开链接

2.解题思路:本题是一道简单的排序题,相信很多人都会做。但是本题值得学习的地方并不在于排序的方法,而是在于如何尽可能的优化I/O时间。下面展示两种不同的输入输出方法的时间差异。

(方法一:利用scanf/printf输入输出)

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<functional>
using namespace std;

#define me(s)  memset(s,0,sizeof(s))
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair <int, int> P;

const int N=200+10;
int a[N];
int main()
{
    int n;
    while(~scanf("%d",&n)&&n)
    {
        memset(a,0,sizeof(a));
        int x;
        for(int i=0;i<n;i++)
            {
                scanf("%d",&x);
                a[x]++;
            }
        int first=1;
        for(int i=1;i<=100;i++)
            for(int j=0;j<a[i];j++)
            {
                if(!first)printf(" ");
                printf("%d",i);
                first=0;
            }
        puts("");
    }
}

运行后,结果如下:
技术分享


(方法二:编写专门的输入输出函数,逐字符的输入,输出)

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<cassert>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<cctype>
#include<functional>
using namespace std;

#define me(s)  memset(s,0,sizeof(s))
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair <int, int> P;

inline int readint()
{
    char c=getchar();
    while(!isdigit(c))
        c=getchar();
    int x=0;
    while(isdigit(c))
    {
        x=x*10+c-'0';
        c=getchar();
    }
    return x;
}

int buf[10];
inline void writeint(int i)
{
    int p=0;
    if(!i)p++;
    else while(i)
    {
        buf[p++]=i%10;
        i/=10;
    }
    for(int j=p-1;j>=0;j--)
        putchar('0'+buf[j]);
}

int main()
{
    int n,x,c[101];
    while(n=readint())
    {
        memset(c,0,sizeof(c));
        for(int i=0;i<n;i++)
            c[readint()]++;
        int first=1;
        for(int i=1;i<=100;i++)
            for(int j=0;j<c[i];j++)
        {
            if(!first)printf(" ");
            first=0;
            writeint(i);
        }
        puts("");
    }
}


运行后,结果如下:

技术分享

的确和《训练指南》上说的一样,时间上优化了约2/3,可见优化效果还是很高的。顺便翻看了一下所有提交记录,能够小于100ms的几乎没有。虽然这是一个非常小的细节问题,但有备无患。

版权声明:本文为博主原创文章,未经博主允许不得转载。

例题1.17 年龄排序 UVa11462

标签:

原文地址:http://blog.csdn.net/u014800748/article/details/47683443

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!