例题1.17 年龄排序 UVa11462

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的几乎没有。虽然这是一个非常小的细节问题,但有备无患。

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

时间: 2024-10-06 05:16:37

例题1.17 年龄排序 UVa11462的相关文章

[示例-NSArray排序]-根据班级、姓名和年龄排序学生信息

main: 1 #import <Foundation/Foundation.h> 2 #import "Person.h" 3 4 int main(int argc, const char * argv[]) { 5 @autoreleasepool { 6 Person *stu1=[[Person alloc]initClasses:@"iOS8" andName:@"ZXY" andAge:21]; 7 Person *st

员工年龄排序之桶排序

我也不知道今天这题目纠结半天我在纠结个啥,题目要求对一个公司所有员工的年龄排序,只能申请O(n)大小的辅助空间.然后看到题目里面的解法大致思路是利用辅助空间记录各个年龄的出现次数,然后接下来的代码硬是读了半天. 1 int index=0; 2 for(int i=0;i<=oldestAge;i++){ 3 for(int j=0;j<timesOfAge[i];j++){ 4 age[index]=i; 5 index++; 6 } 7 } 之前看到题目后的意思是对公司的员工年龄排序,比如

员工年龄排序

转载请注明出处:http://blog.csdn.net/ns_code/article/details/25144793   对公司所有员工的年龄进行排序,公司总共有几万名员工,要求时间复杂度为O(n). 很明显的计数排序题目,员工的年龄肯定在一个范围之内,我们这里假设在0-99之内,算很大了,这样就可以开辟一个长度为100的数组,保存各个年龄的员工的个数. 代码如下: /* 员工年龄排序,主要用计数排序的思想, 时间复杂度为O(n),需要固定大小的额外辅助空间 */ #include<std

年龄排序(计数排序)

/* 员工年龄排序,主要用计数排序的思想,时间复杂度为o(n),需要固定大小的额外辅助空间 */ #include<stdio.h> #include<string.h> /* 计数排序,员工年龄可定在0-99之间 void *memset(void *s, int ch, size_t n) 函数解释:将s中当前位置后面的n个字 节 (typedef unsigned int size_t )用 ch 替换并返回 s .memset:作用是一 段内存块中填充某个给定的值,它是对

【剑指offer】员工年龄排序

典型的以空间换时间问题,思路非常重要! /* 员工年龄排序 员工可能有几万名,要求时间复杂度为O(n) 思路:员工的年龄必定在一个范围内,比方0-99,那么我们建立一个大小为100的辅助数组,然后遍历 员工年龄,取到一个年龄就将该年龄相应数组位置的值加1,终于数组中便保存了不同年龄的员工的个数 最后,打印数组就可以. by Rowandjj 2014/7/22 */ #include<iostream> using namespace std; #define MAX 100 void sor

年龄排序

描述 JXB经常向HJS炫耀他们家乡那里有多么多么好,但是HJS大牛从来对此不屑一顾,某日,他又在那说:“我们那里的人寿命都很高,甚至还有一个150岁的老人呢!”,这次HJS大牛准备调查一下,于是收集了那里每个人的年龄数据,首先得把它们从小到大排序,这个简单的任务就交给你了! 输入 第一行一个n,表示n个数(n<=6000000)第二行有n个数,表示该地区每个人的年龄数据只有一组 输出 按递增序列输出这些年龄 样例输入 6 2 5 6 9 15 3 样例输出 2 3 5 6 9 15 提示 由题

剑指offer-第二章排序之年龄排序

题目:对某个公司的人的年龄(0-99)进行排序,该公司的总人数为几万人.要求时间复杂度为O(n),可以辅助O(n)的空间. 思路:实现函数为void SortAge(int ages[],int len).辅助空间为一个整型数组timesOfAge[100],用来存放每个个年龄的人数(当满足i<len,如果age[i]<=99&&age[i]>=0时候,有timesOfAge[age[i]]++,i++).用一个嵌套的for对ages[],进行排序.外层用i来代表年龄上限

COGS 1406. 邻居年龄排序[Age Sort,UVa 11462]

★   输入文件:AgeSort.in   输出文件:AgeSort.out   简单对比时间限制:1 s   内存限制:2 MB [题目描述] Mr.Zero(CH)喜闻乐见地得到了一台内存大大增强的 OI型 Apple Ⅱ,可以运行C,C++,和Pascal!为了炫耀这台高端的计算机,Mr.Zero决心将邻居们的年龄(0≤Age[i]≤120)统计后进行统计.但是,古董终究是古董,Mr.Zero拥有最多n个邻居(n≤2,400,000)但是计算机所能运行程序时的内存限制竟然达到了2MB.请你

集合内部先实现按年龄排序再实现以姓名排序

定义一个实体存放需要排序的数据 package ListAscByCollectionsMethod; /* * 定义一个实体,存放数据. */ public class User { String name; String age; public User(String name,String age){ this.name=name; this.age=age; } public String getAge() { return age; } public void setAge(Strin