给定一个数,在正常的二进制中它的表示是唯一的。
而在这道题中,由许多种表示方法。比如1,可以是1,可以是2+(-1),可以是4+(-2)+(-1),但是有一点是确定的,如果要构造这个1,要么选1,要么选-1和后面的数组合,不可以不选。
所以由低到高枚举N的每个二进制位,如果这一位上是1,那么不管字符串中这一位是正的还是负的都必须选,如果是负的,那么后面就要多凑出1把这个-1对掉,所以N要+1
如果遍历了k个位N还没变成0,那么就是Impossible
POJ坑:long long可以过 unsigned long long不能过!
代码:
//
// main.cpp
// 1023 The Fun Number System
//
// Created by Baoli1100 on 15/4/1.
// Copyright (c) 2015年 Baoli1100. All rights reserved.
//
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL long long
bool k[70];
LL N;
int res[70];
bool solve(int len){
while(N){
if(len<0) return 0;
if(N&1){
res[len]=1;
if(!k[len]){
N++;
}
}
len--;
N>>=1;
}
return 1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(res,0,sizeof(res));
memset(k,0,sizeof(k));
int l;
scanf("%d",&l);
char s[100];
scanf("%s",s);
for(int i=0;i<l;i++){
if(s[i]=='n') k[i]=0;
else k[i]=1;
}
scanf("%lld",&N);
if(solve(l-1)){
for(int i=0;i<l;i++){
printf("%d",res[i]);
}
printf("\n");
}
else printf("Impossible\n");
}
return 0;
}
本文深入探讨了一种独特的二进制数表示方法及其转换算法,通过实例展示了如何通过选择正数和负数来构建目标数值,同时强调了在不同表示方式之间的转换逻辑,特别指出了解决过程中遇到的长整型与无符号长整型的差异性问题,为读者提供了清晰的思路和实用的代码实现。

415

被折叠的 条评论
为什么被折叠?



