zoukankan      html  css  js  c++  java
  • Codeforces Round #267 (Div. 2) B. Fedor and New Game【位运算/给你m+1个数让你判断所给数的二进制形式与第m+1个数不相同的位数是不是小于等于k,是的话就累计起来】

    After you had helped George and Alex to move in the dorm, they went to help their friend Fedor play a new computer game «Call of Soldiers 3».

    The game has (m + 1) players and n types of soldiers in total. Players «Call of Soldiers 3» are numbered form 1 to (m + 1). Types of soldiers are numbered from 0 to n - 1. Each player has an army. Army of the i-th player can be described by non-negative integer xi. Consider binary representation of xi: if the j-th bit of number xi equal to one, then the army of the i-th player has soldiers of the j-th type.

    Fedor is the (m + 1)-th player of the game. He assume that two players can become friends if their armies differ in at most k types of soldiers (in other words, binary representations of the corresponding numbers differ in at most k bits). Help Fedor and count how many players can become his friends.

    Input

    The first line contains three integers nmk (1 ≤ k ≤ n ≤ 20; 1 ≤ m ≤ 1000).

    The i-th of the next (m + 1) lines contains a single integer xi (1 ≤ xi ≤ 2n - 1), that describes the i-th player's army. We remind you that Fedor is the (m + 1)-th player.

    Output

    Print a single integer — the number of Fedor's potential friends.

    Sample test(s)
    Input
    7 3 1
    8
    5
    111
    17
    
    Output
    0
    
    Input
    3 3 3
    1
    2
    3
    4
    
    Output
    3

    【分析】:
    “<< ”   位左移,相当于乘以2
     “>>"   位右移,相当于除以2
     “&”    按为与,位数都为1时为1,否则为0
     “^”    异或,不同为1,相同为0
    
    
    新技能: a & (1 << j )  表示数a二进制的第j位是什么

    【代码】:
    #include <bits/stdc++.h>
    
    using namespace std;
    const int maxn = 1005;
    int n,m,k,a[maxn];
    
    int main()
    {
        int sum=0,ans=0;
        cin>>n>>m>>k;
        for(int i=0;i<=m;i++)
            cin>>a[i];
        for(int i=0;i<m;i++)
        {
            sum=0; //注意内部清零
            for(int j=0;j<n;j++)
               if( ( a[i]&(1<<j) )^( a[m]&(1<<j) ) ) sum++;
            if(sum<=k) ans++;
        }
    
        cout<<ans<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    UVA 10618 Tango Tango Insurrection
    UVA 10118 Free Candies
    HDU 1024 Max Sum Plus Plus
    POJ 1984 Navigation Nightmare
    CODEVS 3546 矩阵链乘法
    UVA 1625 Color Length
    UVA 1347 Tour
    UVA 437 The Tower of Babylon
    UVA 1622 Robot
    UVA127-"Accordian" Patience(模拟)
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7953590.html
Copyright © 2011-2022 走看看