注册 登录
编程论坛 C++教室

一道ACM的题求解

红糖水 发布于 2013-02-04 17:32, 499 次点击
Problem C
小媛在努力
时间限制:1000 ms  |  内存限制:65535 KB
描述
在多媒体数据处理中,数据压缩算法尤为重要。小媛上完课后就想自己发明一个数据压缩算法。她想呀想,终于想到一个方法。在多媒体数据中有很多数据都是重复的,所以她想把连续相同的数据用数据出现的次数和数据本身表示。例如:1 1 1 2 3 3 3 3 3  压缩后及为3 1 1 2 5 3(表示3个1,1个2和5个3)。有想法后小媛就希望把它用代码实现了。但是大家都知道小媛现在整天都忙着苦B的复习考研,连电脑都摸不到。所以她希望作为ACMer的你帮她写一下。
输入
输入包含多组数据,第一行一个数字T代表输入样例数。

每组样例开始一个数M < 10^7表示这组数据中数字的个数,接下来M个数表示要被压缩的数字(数字都不超过int表示的范围)。
输出
每组测试数据输出一行数字对,如上面描述的一样。两个数字之间用一个空格隔开。
样例输入
1
9 1 1 1 2 3 3 3 3 3 样例输出
3 1 1 2 5 3
7 回复
#2
风雨1232013-02-24 14:25
soory,我试着做了,没有做出来。
#3
fangjun6662013-02-25 00:23
#include<iostream>
//用一个数组来存放输入的样例,用另外一个数组来存放每个连续数字的个数
//只统计连续相同的数,不相邻的即使相同也要重新实现
int E[1000];
struct total{
    int data;
    int count;
}C[1000];           //统计数组

int main()
{
    int T; //输入样例个数的参数
    int j=0;   //用于C数组的下标
    int cnt = 0;    //内部计数器
    std::cin>>T;
    for (int i=0;i<1000;i++)
    {
        E[i] = 0;
        C[i].data = 0;
        C[i].count = 0;
    }
    for (int i=0;i<T;i++)
    {
        std::cin>>E[i];
    }
    C[0].data = E[0];            //将样例数组的第一个数赋值给C【】
    C[0].count = 1;
    for (int i=0;i<T;i++)
    {
        if (E[i] == E[i+1])   //如果连续的数相同只添加个数不改变原来的值
        {
            C[j].count++;
        }
        else if (E[i] != E[i+1])
        {
            //i= i+1;
            j++;
            C[j].count++;
            C[j].data = E[i+1];
        }
    }
    for (int k=0;k<j;k++)
    {
        std::cout<<C[k].count<<" "<<C[k].data<<" ";
    }
    std::cout<<std::endl;
    system("pause");
    return 0;
}
不知道这样能不能在比较多数据的时候满足时间上的要求。还没有仔细想其他的方法,不过可以完成题目例子。
#4
Susake2013-02-25 00:47
。。。。
#5
rjsp2013-02-25 08:32
贴在C++板块中,我认为你要C++代码;但第一句话就是Problem C,又不得不认为你要的是C代码。你的行为令我迷糊

程序代码:
#include <stdio.h>

int main()
{
    int t;
    scanf( "%d", &t );
    while( t-- )
    {
        int m, a=0, b=0;
        scanf( "%d", &m );
        while( m-- )
        {
            int d;
            scanf( "%d", &d );

            if( d == b )
            {
                ++a;
            }
            else
            {
                if( b != 0 )
                    printf( "%d %d ", a, b );
                a = 1;
                b = d;
            }
        }
        if( b != 0 )
            printf( "%d %d\n", a, b );
    }

    return 0;
}

#6
红糖水2013-03-12 09:23
回复 5楼 rjsp
PROBLEM C是题目。。。我表示很无语
#7
红糖水2013-03-12 09:24
回复 2楼 风雨123
没事,我做出来了
#8
红糖水2013-03-12 09:24
回复 3楼 fangjun666
数组永远不够大,要一个个的输入
1