【STL】NYOJ 412 Same binary weight (bitset)

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=412

              Same binary weight

时间限制:300 ms  |  内存限制:65535 KB

难度:3

描述 

The binary weight of a positive  integer is the number of 1‘s in its binary representation.for example,the decmial

number 1 has a binary weight of 1,and the decimal number 1717 (which is 11010110101 in binary) has a binary weight

of 7.Give a positive integer N,return the smallest integer greater than N that has the same binary weight as N.N will

be between 1 and 1000000000,inclusive,the result is guaranteed to fit in a signed 32-bit interget.

输入
The input has multicases and each case contains a integer N.
输出
For each case,output the smallest integer greater than N that has the same binary weight as N.
样例输入
1717
4
7
12
555555
样例输出
1718
8
11
17
555557

看到问题后没有任何思路,在查看讨论区以后发现是使用STL中的bitset来解决的

大体看完了bitset的用法

或许暴力的方法是可行的,每次+1逐一尝试

 1 #define _CRT_SBCURE_NO_DEPRECATE
 2 #include <bitset>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <iostream>
 6
 7 using namespace std;
 8
 9 int main()
10 {
11     int n;
12     while(scanf("%d",&n)!=EOF)
13     {
14         bitset<32> b(n);
15         int nlen = b.count();
16         int ilen;
17         for(int i = n+1;;i++)
18         {
19             bitset<32> bb(i);
20             ilen = bb.count();
21             if(nlen == ilen)
22             {
23                 cout << i << endl;
24                 break;
25             }
26         }
27     }
28
29     return 0;
30 }

但是提交后超时了,看来需要找更快的方法,看完别人的题解后来自己找一下规律解决问题

将十进制转化为二进制

4 :00000100

8 :00001000

7 :00000111

11:00001011

12:00001100

17:00010001

1717:0011010110101

1718:0011010110110

1.从右到左发现的第一个01都变成了10

2.发现的第一个01的左边是没有变化的

3.01右边的1都移动到了最右边

(其实我也不知道怎么发现的这么神奇的规律   emmmm...)

一道比较神奇的题目

接下来的工作就简单些了,根据发现的规律来实现代码

#define _CRT_SBCURE_NO_DEPRECATE
#include <bitset>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>

using namespace std;

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        bitset<32> b(n);
        int i,coun = 0;
        for(i = 0;i < 32;i++)
        {
            if(b[i] == 1)
                coun++;
            if(b[i] == 1 && b[i+1] == 0)
            {
                b[i] = 0;
                b[i+1] = 1;
                break;
            }
        }
        int j = i-1;
        for(int i = 0;i <= j;i++)
        {
            if(i < coun-1)
                b[i] = 1;
            else
                b[i] = 0;
        }
        cout << b.to_ulong() << endl;
    }

    return 0;
}

原文地址:https://www.cnblogs.com/duny31030/p/8830762.html

时间: 2024-10-05 05:04:42

【STL】NYOJ 412 Same binary weight (bitset)的相关文章

【C++】【STL】二分查找函数

binary_search 这个函数的返回值是布尔型,也就是最简单的找到了就为真,没找到就是假. 传入参数有三个,数据集合的左端点,数据集合的右端点,查找的值. 注意这些左端点右端点是要求左开右闭原则的,就是和数学上的左开右闭区间[a, b)一样,右端点是个不会被查阅的值. 一般来说写法类似: bool flag = false; int data[n] = {...};///数据 sort(data, data + n); flag = binary_search(data, data + n

HDU2072 单词数 【STL】+【strtok】

单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 28045    Accepted Submission(s): 6644 Problem Description lily的好朋友xiaoou333最近很空,他想了一件没有什么意义的事情,就是统计一篇文章里不同单词的总数.下面你的任务是帮助xiaoou333解决这个问题. Inp

【STL】Codeforces 696A Lorenzo Von Matterhorn

题目链接: http://codeforces.com/problemset/problem/696/A 题目大意: 一个满二叉树,深度无限,节点顺序编号,k的儿子是k+k和k+k+1,一开始树上的边权都为0 N(N<=1000)个操作,操作两种,1是从u到v的路径上的所有边权+w,2是求u到v的边权和.(1 ≤ v, u ≤ 1018, v ≠ u, 1 ≤ w ≤ 109) 题目思路: [STL] 用map写很快,第一次用很生疏.现学只看了一点点. 因为是满二叉树所以直接暴力求LCA和求解,

【LeetCode】 Maximum Depth of Binary Tree

Maximum Depth of Binary Tree  Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 递归基础,不解释. class Solution { public: int getMax(TreeNode *root

【STL】帮你复习STL泛型算法 一

STL泛型算法 #include <iostream> #include <vector> #include <algorithm> #include <iterator> #include <numeric> #include <list> using std::cout; using std::endl; using std::vector; using std::list; bool IsOushu(const int&

【STL】栈stack

栈stack 头文件与定义 #include<stack> stack<long long>mystack;    //以下以mystack为例 用法 1.将元素a入栈:mystack.push(a); 2.将栈顶元素弹栈/出栈:mystack.pop(); 3.判断栈是否为空:mystack.empty() 4.栈的长度:cout<<stack.size(); 5.访问栈顶元素:cout<<stack.top(); 注意事项 1.在出栈或者访问栈顶元素之前

【中途相遇法】【STL】BAPC2014 K Key to Knowledge

题目链接: http://codeforces.com/gym/100526 http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11674&courseid=0 题目大意: N个学生M道题(1<=N<=12,1<=M<=30),每道题只有正误两种选项(0 1),每个学生的答题情况和正确题数已知,求标准答案可能有多少种. 如果标准答案只有一种则输出标准答案,否则输出解的个数. 题目思路: [

【STL】- vector的使用

初始化: 1. 默认构造: vector<int> vint; 2. 用包含10个元素的数组初始化: vector<int> vint(ia, ia+10); 算法: 1. vint.push_back(i); 2. vint.size(); 3. vint[i]; 代码: 1 #include <vector> 2 #include <iostream> 3 using namespace std; 4 5 int ia[] = {123,1,32,53,

HDU2094 产生冠军 【STL】

产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8523    Accepted Submission(s): 4009 Problem Description 有一群人,打乒乓球比赛,两两捉对撕杀,每两个人之间最多打一场比赛. 球赛的规则如下: 如果A打败了B,B又打败了C,而A与C之间没有进行过比赛,那么就认定,A一定能打