(hnust 1520) 压缩编码 (技巧模拟)

来源:互联网 发布:mac下载不在桌面显示 编辑:程序博客网 时间:2024/04/28 18:01

时间限制: 1 Sec 内存限制: 2 MB
提交: 106 解决: 53
[提交][状态][讨论版]
题目描述
  某工业监控设备不断发回采样数据。每个数据是一个整数(0到1000之间)。各个数据间用空白字符(空格,TAB或回车换行)分隔。
  因为大多数时候,相邻的采样间隔数据是相同的,可以利用这个特征做数据的压缩存储。其方法是:对n(n>1)个连续相同的数字只记录n和该数字本身;对m(m>0)个连续不重复的数字,则记录 m*-1 和这些数字本身(之所以用负数,是为了与第一种情况区分,便于解压缩)。

例1:假设采样数据为:12 34 34 25 25 25 25 11 15 17 28 14 22 22 22 则将上述采样数据按照上述规则进行压缩编码后的数据为:-1 12 2 34 4 25 -5 11 15 17 28 14 3 22例2:假设采样数据为:12 13 14 13 12则将上述采样数据按照上述规则进行压缩编码后的数据为:-5 12 13 14 13 12例3:假设采样数据为:66 66 66 66 66 88 88 88 88 88 88 88 88 88 88 88 则将上述采样数据按照上述规则进行压缩编码后的数据为:5 66 11 88

输入
先输入采样数据的个数n(1<=n<=10000)。

然后输入n个采样数据。每个数据是一个整数(0到1000之间,包括0和1000本身)。各个数据间用空白字符(空格,TAB或回车换行)分隔。

输出
输出按规则进行压缩编码后的数据,数据之间用一个空格隔开。

注意,最后一个输出数据之后,没有空格,而是换行符。

样例输入
16
12 34 34 25 25 25 25 11 15 17 28 14 22 22 22 13
样例输出
-1 12 2 34 4 25 -5 11 15 17 28 14 3 22 -1 13

来源
2012新手选拔赛第一场

分析:模拟,处理最后一位时的技巧

#include<cstdio>#include<vector>#include<cstring>#include<algorithm>using namespace std;const int INF=0x3f3f3f3f;const int N=1e4+5;typedef long long LL;#define mem(a,n) memset(a,n,sizeof(a))int a[N],b[N];vector<int>vec;int main(){    int n;    while(~scanf("%d",&n))    {        vec.clear();        mem(a,INF);        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        n++,a[n]=a[n-1];        int tmp=a[0],cnt;        for(int i=1; i<n;)        {            cnt=0;            if(tmp==a[i])            {                cnt++;                while(i<n&&tmp==a[i])                {                    tmp=a[i];                    cnt++,i++;                }                vec.push_back(cnt);                vec.push_back(tmp);                tmp=a[i];                cnt=0,i++;            }            else            {                while(i<n&&tmp!=a[i])                {                    b[cnt]=tmp;                    tmp=a[i];                    cnt++,i++;                }                vec.push_back(-cnt);                for(int i=0; i<cnt; i++)                    vec.push_back(b[i]);            }        }        printf("%d",vec[0]);        for(int i=1; i<vec.size(); i++)            printf(" %d",vec[i]);        printf("\n");    }    return 0;}
原创粉丝点击