• uva 10718 Bit Mask(贪心)


    题目连接:10718 Bit Mask


    题目大意:给出一个T, 和一个下限L, 上限R, 在[L, R]之间找一个数, 使得这个数与T做或运算之后的数值最大 输出这个数。


    解题思路:将T转换成二进制,对应的为0的地方要填1, 为1的地方填0, 判断的时候还要考虑上下限的问题。


    #include <stdio.h>
    #include <string.h>
    const int M = 32;
    
    long long T, L, R;
    int tmp[M + 1], Max[M + 1], Min[M + 1], ans[M + 1];
    
    void getBase(long long cur, int now[]) {
        memset(now, 0, sizeof(now));
        for (int i = 0; i <= M; i++) {
    	now[i] = cur % 2;
    	cur /= 2;
        }
    }
    
    long long solve() {
        getBase(T, tmp);
        getBase(R, Max);
        getBase(L, Min);
        int Maxflag = 0, Minflag = 0;
        memset(ans, 0, sizeof(ans));
    
        for (int i = M; i >= 0; i--) {
    	if (tmp[i] == 0 && Maxflag) {
    	    ans[i] = 1;
    	    if (Min[i] == 0)    Minflag = 1;
    	}
    	else if (tmp[i] && Minflag) {
    	    ans[i] = 0;
    	    if (Max[i])	Maxflag = 1;
    	}
    	else if (tmp[i]) {
    	    if (Min[i] == 0) {
    		ans[i] = 0;
    		if (Max[i])	Maxflag = 1;
    	    }
    	    else if (Min[i])	ans[i] = 1;
    	}
    	else {
    	    if (Max[i]) {
    		ans[i] = 1;
    		if (Min[i] == 0)    Minflag = 1;
    	    }
    	    else if (Max[i] == 0)   ans[i] = 0;
    	}
        }
    
        long long sum = 0;
        for (int i = M; i >= 0; i--)
    	sum = sum * 2 + ans[i];
    
        return sum;
    }
    
    int main() {
        while (scanf("%lld%lld%lld", &T, &L, &R) == 3) {
    	printf("%lld
    ", solve());
        }
        return 0;
    }
    
  • 相关阅读:
    c++ set unordered_set区别
    LeetCode 213. 打家劫舍 II
    LeetCode 152. 乘积最大子序列
    [HAOI 2012] 外星人
    [HAOI 2016] 找相同字符
    [ZJOI2007] 仓库建设
    [SCOI 2016] 美味
    [BZOJ 2127] Happiness
    [NOI2009] 植物大战僵尸
    [SDOI 2016] 数字配对
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3294093.html
Copyright © 2020-2023  润新知