试题 算法训练 Bit Compressor

 

试题 算法训练 Bit Compressor

 

资源限制

时间限制:1.0s   内存限制:256.0MB

问题描述

  数据压缩的目的是为了减少存储和交换数据时出现的冗余。这增加了有效数据的比重并提高了传输速率。有一种压缩二进制串的方法是这样的:
  将连续的n个1替换为n的二进制表示(注:替换发生当且仅当这种替换减少了二进制串的总长度)
  (译者注:连续的n个1的左右必须是0或者是串的开头、结尾)
  比如:11111111001001111111111111110011会被压缩成10000010011110011。原串长为32,被压缩后串长为17.
  这种方法的弊端在于,有时候解压缩算法会得到不止一个可能的原串,使得我们无法确定原串究竟是什么。请你写一个程序来判定我们能否利用压缩后的信息来确定原串。给出原串长L,原串中1的个数N,以及压缩后的串。
  L<=16 Kbytes,压缩后的串长度<=40 bits。

输入格式

  第一行两个整数L,N,含义同问题描述
  第二行一个二进制串,表示压缩后的串

输出格式

  输出"YES"或"NO"或"NOT UNIQUE"(不包含引号)
  分别表示:
  YES:原串唯一
  NO:原串不存在
  NOT UNIQUE:原串存在但不唯一

样例输入

样例1:
32 26
10000010011110011
样例2:
9 7
1010101
样例3:
14 14
111111

样例输出

样例1:YES
样例2:NOT UNIQUE
样例3:NO

解析:

这道题是一个 尽可能把一个串压缩 只要符合条件我就压缩 那我们所做的就是 尽可能展开
分析题 可以知道  压缩的结构 如果处在中间位置: 01xxxx0 如果头:1xxxx0 ,尾巴: 1xxxx
 
仔细分析就可以把上面三种  可以变为一种结构就是 1xxxxx0 ,我只要把中间结构中 01xxxx0 中的第一个1 去掉变为1xxxx0,同时尾巴:1xxxx 补上一个0 就行了(尾巴的情况 可以使用别的方法 我参考大佬的代码 就是用的别的情况 处理掉但 补0 处理也行)
 
那么现在压缩的结构就是 1xxxx0  我们需要做的就是 一个一个找出压缩的结构进行处理 到这里  题目已经变为 如何找一个符合条件的结构, 然后进行处理,然后继续找 , 那么就形成了一个递归的过程.
如何找符合条件的结构:
1xxxx0  可以看出 结构中 开头为1 结尾为0  所以需要这两个条件来找出符合条件的结构  
 
结构的处理:
是否符合压缩条件 如果符合展开 并计算1的个数和串此时的长度  
 
如果不符合压缩条件 比如1010101 ,开头两位10  符合压缩结构但是不符合压缩的条件  所以不需要统计 只需 n+1 len+1 然后继续递归
 
ps:11 是一个特殊的情况  需要特殊的处理   11 压缩前可以是 11 也可以是111 所以需要处理 
 
https://blog.csdn.net/weixin_45080867/article/details/104947136?%3E   我的代码是参考这位大佬写的 看不懂的可以看这个 他写 的很好
写的不好 抱歉了:
#include 
#include 
using  namespace std;
int l,n;
int length;
string data;
int result=0;
int  get(int b,int e)
{
    int i;
    int sum=0;
    for(i=b;i1)return;
    if(len>l)return;
    if(nsum>n)return;

    if(start==length&& len==l && nsum==n)
    {
        result++;
        return;
    }
    int i;
    if(data[start]=='1')
    {
        //注意这个地方 i 从是start 开始的 不要从start+1开始
        // 这里从start开始 是为了处理 10 这种情况  10是不符合压缩的条件的
        // 所以 需要把1 当做一个数1 进行处理 然后 继续递归
        for(i=start;i>l>>n;
	cin>>data;
	//data+="0";  补0
	length=data.length();
	//l+=1;    如果补0 长度+1
	dfs(0,0,0);
    if(result==1)cout << "YES\n";
    if(result>1)cout << "NOT UNIQUE\n";
    if(result<1)cout << "NO\n";
	return 0;
}

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

你可能感兴趣的:(dp,蓝桥杯)