POJ 1023 The Fun Number System (递推)

给定一个数,在正常的二进制中它的表示是唯一的。

而在这道题中,由许多种表示方法。比如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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值