NYOJ-年龄排序(拼时间)

时间限制:5秒 内存限制:128兆

题目描述

JXB经常向HJS炫耀他们家乡那里有多么多么好,但是HJS大牛从来对此不屑一顾,某日,他又在那说:“我们那里的人寿命都很高,甚至还有一个150岁的老人呢!”,这次HJS大牛准备调查一下,于是收集了那里每个人的年龄数据,首先得把它们从小到大排序,这个简单的任务就交给你了!

输入

第一行一个n,表示n个数(n<=6000000)
第二行有n个数,表示该地区每个人的年龄
数据只有一组

输出

按递增序列输出这些年龄

样例输入

6
2 5 6 9 15 3

样例输出

2 3 5 6 9 15

提示

由题意,所有人的年龄<=150

分析:考察对排序的掌握

方法1:STL快速排序(运行时间4876ms  险些挂掉)

辛亏输入输出用的是scanf和printf如果用cin和cout肯定挂

#include<stdio.h>
#include<algorithm>
using namespace std;
const int M=6e6+5;
int  a[M],i,j,k,n;
int main()
{
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	    scanf("%d",&a[i]);
	sort(a+1,a+n+1);
	for(i=1;i<=n;i++)
	    printf("%d ",a[i]);
}

方法2:桶排序(后来发现自己不读题,题目说最大年龄不超过150岁,惭愧惭愧^_^|||)(运行时间 3264ms,快了不少)

#include<stdio.h>
typedef long long ll;
const int M=160;
ll a[M],n,num,i,j;
int main()
{
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&num);
		a[num]++;
	}
	for(i=0;i<=150;i++)
	if(a[i]>0)
	for(j=1;j<=a[i];j++)
	printf("%d ",i);
}

如果想追求完美,可以再优化一下(运行时间2264 ms,部分判题机不支持此方法)

#include<iostream>
#include<algorithm>
using namespace std;
const int M=160;
int a[M],n,num,i,j;
int main()
{
	std::ios::sync_with_stdio(false);
        std::cin.tie(0);
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>num;
		a[num]++;
	}
	for(i=0;i<=150;i++)
	if(a[i]>0)
	for(j=1;j<=a[i];j++)
	cout<<i<<' ';
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值