(队列思想+快排函数)—keke祝你元宵节快乐!

think:
1题目首先输入一个字符串,然后根据6的位置可以把其前面的符合要求的字符串存放在一个队列里,当遇到6时候判断队列是否为空,若不为空则可以将其转化为实数存放在整型数组里面,以上只是6位于字符串中间以及末尾,还需要考虑的情况有
1>6位于字符串第一位
2>字符串最后一位不为6
3>整个字符串只有一位
2 将满足条件的数据存放在整型数组中之后,可以选择调用快排函数进行排序,尽量优化时间,避免时间超时
3注意细节,尤其像数组的范围需要考虑临界条件进行判断,根据输入的字符串长度范围可以算得临界最多可以有333333个数,因此在定义整型数组的时候才可以尽量准确,不至于偏差太大,还有就是题意要求每组数据输出结束后输出一个空行,也是需要注意的

sdut原题链接

keke祝你元宵节快乐!
Time Limit: 1000MS Memory Limit: 65536KB

Problem Description
今天是元宵节,所以我们集训队的长者 (bLue) 决定在今天自掏腰包请大家吃汤圆。听到有免费的午餐,吃货们一个个跑得比西方的记者还要快,这也导致了场面十分混乱,所以长者决定将恢复排队队列有序这个光荣的任务交给你,希望你不要令长者失望!
每个吃货都有一个长度不超过4位的序号,例如 “0807”, “15”, “007” 等等,由于人太多,我们并不知道有多少人在排队,只知道代表排队队列的一串由 ‘0’-‘9’ 组成的字符串,代表吃货们的序号,不同的吃货序号中间由一个或多个连续的字符 ‘6’ 分隔开,请从小到大输出吃货们的序号!

Input
第一行输入一个组数 T (1 <= T <= 10)。
每组输入一个字符串(长度不超过 666666),代表当时排队队列的字符串。

Output
对于每组输入,先输出 “Case x:”(不包括引号)代表第几组。
接下来一行请从小到大输出 K 个整数表示吃货的序号(不能有前导零)。
每组末尾输出一个空行。

Example Input
1
1067810666666160674368467486666666

Example Output
Case 1:
0 1 10 84 743 748 7810

Hint
示例解释:
10 6 7810 666666 1 6 0 6 743 6 84 6 748 6666666
10 7810 1 0 743 84 748

Author
「2017年寒假集训 阶段测试赛2 - 元宵节专场」keke

以下为accepted代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int top, flag, data[400000];
char link[9], st[700000];
int cmp(const void *a, const void *b)
{
    return ((*(int *)a) - (*(int *)b));
}
int pow(int n, int m)
{
    int ans = 1;
    while(m--)
    {
        ans *= n;
    }
    return ans;
}
int main()
{
    int T, i, k, len, sum;
    scanf("%d", &T);
    getchar();
    for(k = 1; k <= T; k++)
    {
        top = flag = 0;

        scanf("%s", st);
        len = strlen(st);

        link[top++] = st[0];
        for(i = 1; i < len; i++)
        {
            if(st[i] != '6')
            {
                link[top++] = st[i];
            }
            else if(st[i] == '6' && top != 0)
            {
                sum = 0;
                for(int j = 0; j < top; j++)
                {
                    sum += (link[j]-'0')*pow(10, top-j-1);
                }

                data[flag++] = sum;
                top = 0;
            }
        }

        if(st[len-1] != '6' || len == 1)
        {
            sum = 0;
            for(i = 0; i < top; i++)
            {
                sum += (link[i]-'0')*pow(10, top-i-1);
            }
            data[flag++] = sum;
            top = 0;
        }

        qsort(&data[0], flag, sizeof(data[0]), cmp);
        printf("Case %d:\n", k);
        for(i = 0; i < flag; i++)
        {
            printf("%d%c", data[i], i == flag-1? '\n': ' ');
        }
        printf("\n");
    }
    return 0;
}


/***************************************************
User name: jk160630
Result: Accepted
Take time: 296ms
Take Memory: 3788KB
Submit time: 2017-02-13 19:34:20
****************************************************/

以下为presentation error代码—每组数据结束后输出一个空行
百度:校内ACM上出现Presentation Error的一点经验

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int top, flag, data[400000];
char link[9], st[700000];
int cmp(const void *a, const void *b)
{
    return ((*(int *)a) - (*(int *)b));
}
int pow(int n, int m)
{
    int ans = 1;
    while(m--)
    {
        ans *= n;
    }
    return ans;
}
int main()
{
    int T, i, k, len, sum;
    scanf("%d", &T);
    getchar();
    for(k = 1; k <= T; k++)
    {
        top = flag = 0;

        scanf("%s", st);
        len = strlen(st);

        link[top++] = st[0];
        for(i = 1; i < len; i++)
        {
            if(st[i] != '6')
            {
                link[top++] = st[i];
            }
            else if(st[i] == '6' && top != 0)
            {
                sum = 0;
                for(int j = 0; j < top; j++)
                {
                    sum += (link[j]-'0')*pow(10, top-j-1);
                }

                data[flag++] = sum;
                top = 0;
            }
        }

        if(st[len-1] != '6' || len == 1)
        {
            sum = 0;
            for(i = 0; i < top; i++)
            {
                sum += (link[i]-'0')*pow(10, top-i-1);
            }
            data[flag++] = sum;
            top = 0;
        }

        qsort(&data[0], flag, sizeof(data[0]), cmp);
        printf("Case %d:\n", k);
        for(i = 0; i < flag; i++)
        {
            printf("%d%c", data[i], i == flag-1? '\n': ' ');
        }
    }
    return 0;
}


/***************************************************
User name: jk160630
Result: Presentation Error
Take time: 300ms
Take Memory: 3788KB
Submit time: 2017-02-13 19:32:16
****************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值