hrbust 1526 小猴和冒泡()

小猴和冒泡
Time Limit: 1000 MSMemory Limit: 32768 K
Total Submit: 206(66 users)Total Accepted: 72(47 users)Rating: Special Judge: No
Description

小猴同学遇见了一道难题:给出一个长度为n的序列,将其变成递增序列。

可能对于你来说并不算难题,因为一个qsort就完全可以解决,但是对于小猴同学来说就是个难题了,因为他只会冒泡。

冒泡的思想相信大家都会,每次比较相邻两个数的大小,如果想要得到递增序列,那么前一个数大于后一个数就要把它们交换一下位置,经过n-1趟扫描就能得到想要的递增序列。

但是冒泡的时间复杂度是O(n^2),经常会超时,我们假设每作一次交换需要1ms,而小猴同学遇到的难题时间限制是1000000ms,现在请你帮助小猴同学判断一下他的冒泡算法是否会超时。
Input
本题测试数据不超过200组。对于每组测试数据,第一行输入一个整数n(1<=n<=5000),表示这个序列有n个数,接下来一行有n个数,每两个数之间用空格隔开,代表给出的序列。
Output
对于每组测试数据,如果小猴程序运行的时间小于难题的时间限制,则输出"xiaohouV5!",否则输出"xiaohouTLE!"。(如果小猴程序运行的时间和限制的时间相等,则判TLE)。

Sample Input
4
2 1 4 3
Sample Output
xiaohouV5!
Author
小猴
通2028

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int c[500003];
int n;
struct data
{
    int num,pos;
} a[500003];
bool cmp(data a,data b)
{
    if(a.num==b.num)
        return a.pos<b.pos;
        return a.num<b.num;
}
int lowbit(int x)
{
    return x&(-x);
}
void updata(int x)
{
    while(x<=n)
    {
        c[x]+=1;
        x+=lowbit(x);
    }
}
int getsum(int x)
{
    int sum=0;
    while(x>0)
    {
        sum+=c[x];
        x-=lowbit(x);
    }
    return sum;
}
int hash1[500003];
int main()
{
    while(scanf("%d",&n)==1&&n)
    {
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i].num);
            a[i].pos=i;
        }
        sort(a+1,a+n+1,cmp);

        for(int i=1; i<=n; i++)hash1[a[i].pos]=i;
        long long ans=0;
        memset(c,0,sizeof(c));
        for(int i=1; i<=n; i++)
        {
            updata(hash1[i]);
            ans+=i-getsum(hash1[i]);
        }
        if(ans< 1000000)
        printf("xiaohouV5!\n");
        else printf("xiaohouTLE!\n");
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值