华农oj Problem K: 负2进制【有技巧构造/待补】

Problem K: 负2进制
Time Limit: 2 Sec  Memory Limit: 128 MB
Submit: 51  Solved: 6
[Submit][Status][Web Board]
Description
如果我16岁,我可以悄悄的说我好喜欢你;如果我26岁,我可以大声告诉你我很爱你;可惜我6岁,我什么都给不了你,我还要上小学。

我们都知道2进制,每一位的权值如下:

1 2 4 8 16 32 64

现在我们定义一种-2进制,每一位的权值如下:

1 -2 4 -8 16 -32 64

现在我们给一个正数x,用-2进制表示,输出ceil(x/2),用-2进制表示。

什么是ceil(x)?     ceil(x)就是对x向上取整。

什么是对x向上取整 ?     向上取整就是取≥x的最小整数

什么是≥ ? 就是不小于

什么是不小于? 呵呵

Input
第一行为T代表有T组样例.(T<=20)

接下来有T行,每一行有一个用-2进制表示的正数(保证是正数且位数不超过5*10^5)

Output
对于每组测试输出一行,每行代表一个用-2进制表示的ceil(x/2).(注意不含前导0)

Sample Input
2
10101
10100
Sample Output
11111
11110
HINT

10101 用10进制表示是 21 , ceil(21/2) = 11

10100 用10进制表示是 20 , ceil(20/2) = 10 

注意不要输出前导0
[Submit][Status]

OJ地址

10 -> 11,  002 -> 110, 12 -> 00
第一条是 ceil(x/2) 的变化,后面两条是为了消除 2
---
推出结论,除以2相当于把原来二进制数的每一位变成这一位与后一位都加上1,而第0位不变即可,于是得到新的二进制数,可能存在一些位为2,而这些位可与前面的一位消去,消去后就是答案
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps = 1e-7;
const int maxn = 5e5 + 5;
const double pi = acos(-1.0);
char a[maxn];
int b[maxn];
int main(int argc, char const *argv[]) {
  int t;
  std::cin >> t;
  while(t--)
  {
    memset(b,0,sizeof(b));
    scanf("%s", &a);
    int len = strlen(a);
    for(int i = 0; i < len - 1; i++) {
      if(a[i] =='1') {
        b[i]++;
        b[i+1]++;
      }
    }
    if(a[len-1]=='1') {
      b[len-1]++;
    }
    for(int i = len - 1; i >= 0; --i) {
      if(b[i] >= 2) {
        if(b[i-1] >= 1) {
          b[i-1]--;
          b[i] -= 2;
        }
        else{
          b[i-1]++;
          b[i-2]++;
        }
      }
    }
    int k = 0;
    while (b[k]==0) {
      k++;
    }
    while(k < len) {
      std::cout << b[k];
      k++;
    }
    std::cout << '\n';
  }
  return 0;
}

原文地址:https://www.cnblogs.com/Roni-i/p/8996931.html

时间: 2024-10-13 04:48:17

华农oj Problem K: 负2进制【有技巧构造/待补】的相关文章

华农oj Problem J: 幻化【贪心/抽屉原理】

Problem J: 幻化 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 18 Solved: 3 [Submit][Status][Web Board] Description 遇见你是我一世的春暖花开, 从此清风明月浩瀚星海. 不论结局,很高兴认识你. 她给了他一个长度为n的整数序列a[],他还给了她另外一个长度为n的整数序列b[],现在他想通过每次交换a[i],a[j]使序列a变成b,但是每次交换的代价是|j-i|. 请问最少的代价是多少呢?

华农oj Problem L: CreatorX背英语【STL】

Problem L: CreatorX背英语 Time Limit: 1 Sec Memory Limit: 64 MB Submit: 53 Solved: 36 [Submit][Status][Web Board] Description CreatorX最近在忙着背英语, Hzk is a young and beautiful and cute boy 但是正常背诵的效果他觉得不好,于是他又想了一个点子,倒着背. Boy cute and beautiful and young a i

华农oj Problem B: Averyboy找密码【STL】

Problem B: Averyboy找密码 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 83 Solved: 29 [Submit][Status][Web Board] Description Averyboy获得了一个串只由大小写字母组成的密码,他现在要想办法解开密码的key,这个密码的key就是其中每个字母出现的次数的中位数.他现在重金求key,你能帮助他吗? Input 第一行一个数字T代表测试的组数.(T<=10) 对于每组测试一行只

华农oj 2192: hzk又在打人【CRT合并/待补】

2192: hzk又在打人 Time Limit: 12 Sec Memory Limit: 512 MB Submit: 52 Solved: 1 [Submit][Status][Web Board] Description hzk又要打人了,他让我们做一个cpu能够计算一些简单的指令,首先他有n条指令,指令形如"c x",其中c ={+,^,*},x是一个非负整数. + a , * a , ^ a分别代表加,乘,乘方.假设我们现在有+ 2 , * 3, ^ 2 三个指令那么对于输

hdu1877进制转换

#include <stdio.h> int m; void Ck(int n) { if(n>=m) Ck(n/m); printf("%d",n%m); } int main() { int A,B; unsigned int C; while(scanf("%d",&m),m) { scanf("%d%d",&A,&B); C = A+B; Ck(C); printf("\n")

PAT/进制转换习题集

B1022. D进制的A+B (20) Description: 输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数. Input: 输入在一行中依次给出3个整数A.B和D. Output: 输出A+B的D进制数. Sample Input: 123 456 8 Sample Output: 1103 1 #include <cstdio> 2 3 int main() 4 { 5 int a, b, d; 6 scanf(&q

【数论Day3】进制问题 题目

20170602-1数论_进制 题解:http://www.cnblogs.com/ljc20020730/p/6935240.html 日期 序号 题目名称 输入文件名 输出文件名 时限 内存 算法 难度 081015 1 K进制数 kbased.in kbased.out 1s 256MB 数学分析 1 121028 2 C and.in and.out 1s 128M 数论 2 091110 3 甲型流感 H1N1.IN H1N1.OUT 1s 256MB 快速幂 2 081022 4 数

1022. D进制的A+B (20)

输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数. 输入格式: 输入在一行中依次给出3个整数A.B和D. 输出格式: 输出A+B的D进制数. 输入样例: 123 456 8 输出样例: 1103 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <iostream> 4 #include <string.h> 5 #include &

1022. D进制的A+B

1022. D进制的A+B (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 输入两个非负10进制整数A和B(<=230-1),输出A+B的D (1 < D <= 10)进制数. 输入格式: 输入在一行中依次给出3个整数A.B和D. 输出格式: 输出A+B的D进制数. 输入样例: 123 456 8 输出样例: 1103 1 #include<stdio.h> 2 #include&