UVA之11462 - Age Sort

简介:

【题目】

You are given the ages (in years) of all people of a country with at least 1 year of age. You know that no individual in that country lives for 100 or more years. Now, you are given a very simple task of sorting all the ages in ascending order.

Input

There are multiple test cases in the input file. Each case starts with an integer (0<n<=2000000), the total number of people. In the next line, there are integers indicating the ages. Input is terminated with a case where = 0. This case should not be processed.

Output

For each case, print a line with space separated integers. These integers are the ages of that country sorted in ascending order.

 

Warning: Input Data is pretty big (~  25 MB) so use faster IO.

Sample Input                             Output for Sample Input

5

3 4 2 1 5

5

2 3 2 3 1

0

1 2 3 4 5

1 2 2 3 3

Note: The memory limit of this problem is 2 Megabyte Only.


Problem Setter: Mohammad Mahmudur Rahman

Special Thanks: Shahriar Manzoor

【分析】

由于数据太大,内存限制太紧(甚至都不能把它们全读进内存),因此无法使用快速排序方法。但整数范围很小,可以用计数排序方法。

【代码】

/*********************************
*   日期:2014-5-2
*   作者:SJF0115
*   题号: 11462 - Age Sort
*   地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=26&page=show_problem&problem=2457
*   来源:UVA
*   结果:Accepted
*   总结:计数排序
**********************************/
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main(){
    int i,j,age,n;
    int count[101];
    //freopen("C:\\Users\\wt\\Desktop\\acm.txt","r",stdin);
    while(scanf("%d",&n)!= EOF && n != 0){
        //初始化
        memset(count,0,sizeof(count));
        //统计人数
        for(i = 0;i < n;i++){
            scanf("%d",&age);
            count[age]++;
        }
        //按照年龄从小到大输出
        bool first = true;//标志 控制格式  第一次输出
        for(i = 1;i < 101;i++){
            for(j = 0;j < count[i];j++){
                if(!first){
                    printf(" ");
                }
                first = false;
                printf("%d",i);
            }
        }
        printf("\n");
    }
    return 0;
}

如果还要精益求精,可以优化输入输出,进一步降低运行时间。程序如下。


/*********************************
*   日期:2014-5-2
*   作者:SJF0115
*   题号: 11462 - Age Sort
*   地址:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=26&page=show_problem&problem=2457
*   来源:UVA
*   结果:Accepted
*   总结:
**********************************/
#include<cstdio>
#include<cstring>
#include<cctype> 	//为了使用isdigit宏
//内联函数
//逐字符输入
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;
    //特殊情况:i等于0的时候需要输出0,而不是什么也不输出
    if(i == 0){
        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) putchar(' ');
                first = 0;
                WriteInt(i);
            }
        }
        putchar('\n');
    }//while
    return 0;
}

上述优化使得运行时间缩短了约2/3。一般情况下,当输入输出数据量很大时,应尽量用scanfprintf函数;如果时间效率还不够高,应逐字符输入输出,就像上面的readintwriteint函数。不管怎样,在确信I/O时间成为整个程序性能瓶颈之前,不要盲目优化。测试方法也很简单:输入之后不执行主算法,直接输出一个任意的结果,看看运行时间是否过长。


目录
相关文章
|
3天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1096 0
|
12天前
|
人工智能 运维 安全
|
2天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
432 9
|
11天前
|
人工智能 测试技术 API
智能体(AI Agent)搭建全攻略:从概念到实践的终极指南
在人工智能浪潮中,智能体(AI Agent)正成为变革性技术。它们具备自主决策、环境感知、任务执行等能力,广泛应用于日常任务与商业流程。本文详解智能体概念、架构及七步搭建指南,助你打造专属智能体,迎接智能自动化新时代。
|
3天前
|
弹性计算 Kubernetes jenkins
如何在 ECS/EKS 集群中有效使用 Jenkins
本文探讨了如何将 Jenkins 与 AWS ECS 和 EKS 集群集成,以构建高效、灵活且具备自动扩缩容能力的 CI/CD 流水线,提升软件交付效率并优化资源成本。
290 0
|
10天前
|
人工智能 异构计算
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
敬请锁定《C位面对面》,洞察通用计算如何在AI时代持续赋能企业创新,助力业务发展!
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
B站开源IndexTTS2,用极致表现力颠覆听觉体验
在语音合成技术不断演进的背景下,早期版本的IndexTTS虽然在多场景应用中展现出良好的表现,但在情感表达的细腻度与时长控制的精准性方面仍存在提升空间。为了解决这些问题,并进一步推动零样本语音合成在实际场景中的落地能力,B站语音团队对模型架构与训练策略进行了深度优化,推出了全新一代语音合成模型——IndexTTS2 。
794 23
|
3天前
|
缓存 供应链 监控
VVIC seller_search 排行榜搜索接口深度分析及 Python 实现
VVIC搜款网seller_search接口提供服装批发市场的商品及商家排行榜数据,涵盖热销榜、销量排名、类目趋势等,支持多维度筛选与数据分析,助力选品决策、竞品分析与市场预测,为服装供应链提供有力数据支撑。
|
3天前
|
缓存 监控 API
Amazon item_review 商品评论接口深度分析及 Python 实现
亚马逊商品评论接口(item_review)可获取用户评分、评论内容及时间等数据,支持多维度筛选与分页调用,结合Python实现情感分析、关键词提取与可视化,助力竞品分析、产品优化与市场决策。