• uva 10718 Bit Mask (位运算)



    uva 10718  Bit Mask  (位运算)



    Problem A

    Bit Mask

    Time Limit

    1 Second

     

    In bit-wise expression, mask is a common term. You can get a certain bit-pattern using mask. For example, if you want to make first 4 bits of a 32-bit number zero, you can use 0xFFFFFFF0 as mask and perform a bit-wise AND operation. Here you have to find such a bit-mask.

    Consider you are given a 32-bit unsigned integer N. You have to find a mask M such that L ≤ M ≤ U and N OR M is maximum. For example, if is 100 and L = 50, U = 60 then M will be 59 and N OR M will be 127 which is maximumIf several value of M satisfies the same criteria then you have to print the minimum value of M.

    Input
    Each input starts with 3 unsigned integers NLU where L ≤ U. Input is terminated by EOF.

    Output
    For each input, print in a line the minimum value of M, which makes N OR M maximum.

    Look, a brute force solution may not end within the time limit.

    Sample Input

    Output for Sample Input

    100 50 60
    100 50 50
    100 0 100
    1 0 100
    15 1 15

    59
    50
    27
    100
    1


    Problem setter: Md. Kamruzzaman
    Member of Elite Problemsetters' Panel


    这题很简单,从最高位开始逐位判断,如果N的该位为0,为使M | N的值最大,M的该位应考虑置为1,然后判断M的该位为1时的可能取值区间[lmin, lmax],如果区间[lmin, lmax]与区间[L, U]有交集,则说明该位可置为1;如果N的该位为1,为使M的值尽可能小,M的该位应考虑置为0,然后判断可能取值区间与[L, U]是否有交集,如果没有交集,该位置为1。


    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    
    long long n,l,r,a[100],b[100];
    int cnta,cntb;
    
    void get(){
    	long long x=n;
    	cnta=0;cntb=0;
    	while(x>0){
    		a[cnta++]=x%2;
    		x/=2;
    	}
    	x=r;
    	while(x>0){
    		b[cntb++]=x%2;
    		x/=2;
    	}
    }
    
    void computing(){
    	long long ans=0;
    	if(cntb>cnta){
    		for(int i=cntb-1;i>cnta-1;i--){
    			long long tmp=(long long)1<<(long long)i;//此处不强转,会超出int范围,wa了几次
    			if(b[i]==1){
    				l-=tmp;
    				r-=tmp;
    				ans+=tmp;
    			}
    		}
    	}
    	for(int i=cnta-1;i>=0;i--){
    		long long tmp=(long long)1<<(long long)i;
    		if(tmp<=l){
    			l-=tmp;
    			r-=tmp;
    			ans+=tmp;
    		}
    		else if(a[i]==0 && tmp<=r){
    			l-=tmp;
    			r-=tmp;
    			ans+=tmp;
    		}
    	}
    	printf("%lld
    ",ans);
    } 
    
    int main(){
    	while(scanf("%lld%lld%lld",&n,&l,&r)!=EOF){
    		get();
    		computing();
    	}
    	return 0;
    }


    AC不了,请尝试以下测试数据:

    INPUT:
    22 1 21
    17 3 5
    12 9 17
    622 435 516
    774 887 905
    398 119 981
    550 99 427
    823 684 966
    22398 14719 27341
    29787 21141 30633
    3113 24242 29497
    5021 11052 19571
    7359 6669 19790
    993331 367623 921769
    810986 227838 492138
    987964 208251 1034287
    1002648 217556 236589
    680047 402532 767548
    27719912 10747535 22001285
    16862072 13339946 28844391
    20421198 11724734 31928748
    1541522 10226990 20764468
    22651935 2478699 31095674
    1995360670 908222743 1868651617
    305542918 594331857 1426036714
    1265639777 1580376576 1885248297
    1442823820 658800174 1919310996
    604563406 1050668699 2128532112
    1          0        4294967295
    


    OUTPUT:
    9
    4
    17
    435
    905
    625
    409
    712
    14721
    23460
    29462
    19554
    17216
    382924
    237589
    257219
    234343
    499600
    14223127
    16692359
    13133233
    19429997
    10902496
    957429345
    1305069817
    1880088222
    704659827
    1542920241
    4294967294



  • 相关阅读:
    树莓派3的无线设置
    Zabbix监控
    使用mutt+msmtp在Linux命令行界面下发邮件(续)
    K8S(16)集成实战-使用spinnaker进行自动化部署
    K8S(15)监控实战-ELK收集K8S内应用日志
    K8S(14)监控实战-grafana出图_alert告警
    K8S(13)监控实战-部署prometheus
    K8S(12)配置中心实战-多环境交付apollo三组件
    K8S(11)配置中心实战-单环境交付apollo三组件
    K8S(10)配置中心实战-configmap资源
  • 原文地址:https://www.cnblogs.com/james1207/p/3281541.html
Copyright © 2020-2023  润新知