HDU 5272 Dylans loves numbers——BestCoder Round #45(模拟)

Dylans loves numbers

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)


Problem Description
Who is Dylans?You can find his ID in UOJ and Codeforces.
His another ID is s1451900 in BestCoder.

And now today's problems are all about him.

Dylans is given a number  N .
He wants to find out how many groups of "1" in its Binary representation.

If there are some "0"(at least one)that are between two "1",
then we call these two "1" are not in a group,otherwise they are in a group.
 

Input
In the first line there is a number  T .

T  is the test number.

In the next  T  lines there is a number  N .

0N1018,T1000
 

Output
For each test case,output an answer.
 

Sample Input
   
   
   
   
1 5
 

Sample Output
   
   
   
   
2
 

Source
BestCoder Round #45
 
/************************************************************************/

附上该题对应的中文题

Dylans loves numbers

 
 
 Time Limit: 2000/1000 MS (Java/Others)
 
 Memory Limit: 131072/131072 K (Java/Others)
问题描述
Dylans是谁?你可以在 UOJ 和 Codeforces上看到他。
在BestCoder里,他有另外一个ID:s1451900。
今天的题目都和他有关哦。
Dylans得到了一个数NN。他想知道N的二进制中有几组1。
如果两个1之间有若干个(至少一个)0 “挡住”,他们就不是同一组的,
否则他们就是同一组的。
输入描述
第一行读入一个数TT表示数据组数。
接下来TT行,每行一个数NN0 \leq N \leq 10^{18},T \leq 10000N1018,T1000
输出描述
对于每组数据,输出一个数表示答案。
输入样例
1
5
输出样例
2
/****************************************************/

出题人的解题思路:

这道题就是按照题意模拟。

设读入的数是NN,我们先把NN分解成二进制形式放在数组AA里。(正反顺序没有关系)

然后对A数组循环一边,如果当前位置是1而前一位是0那么计数器就++。注意一些小的细节。 时间复杂度为O(T*log(N))O(Tlog(N))

本题问的是N的二进制表示中有多少组1,若1与1之间存在0,就表示是不同的组,否则就是同一组
例如1100只有1组,因为两个1是相邻的,而11001就有两组1,最前面的两个1是一组,最后一个1是一组。

我们需要做的就是先将十进制的n转化成二进制形式,然后除第一个1外挨个判断每个1之前是否有出现过0,有的话就++。当然N=0时,直接输出0即可。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<stdlib.h>
#include<cmath>
#include<string>
#include<algorithm>
#include<iostream>
#define exp 1e-10
using namespace std;
const int N = 100;
const int inf = 1000000000;
int s[N];
int main()
{
    int t,i,k,x,c,v;
    __int64 n;
    scanf("%d",&t);
    while(t--)
    {
        k=0;v=0;
        scanf("%I64d",&n);
        if(!n)
        {
            puts("0");
            continue;
        }
        while(n)
        {
            s[k++]=n%2;
            n/=2;
        }
        for(v=0,c=1,i=k-2;i>=0;i--)
            if(s[i])
            {
                if(v)
                    c++;
                v=0;
            }
            else
                v=1;
        printf("%d\n",c);
    }
    return 0;
}
菜鸟成长记

你可能感兴趣的:(模拟,ACM)