uva 10718 Bit Mask(位操作贪心)

这道题目我没怎么想就去看题解了,原因只是因为我觉得我想不出来,真没有自信啊。。。唉,真没有钻入题目进去的

恒心。。。慢慢培养,不能再这样了,不能轻易看题解啊。。。

分析:

首先题目中已经说了枚举肯定会超时的,所以呢,网上看到的是枚举32比特位,然后和n与,来判断当前位是1还是0,

如果是0的话,就换成1,除非换成1后比区间的最大值还要大。因为换成一能保证最后或的结果最大。

如果是1的话,就换成0(这样能保证结果相同的情况下选的数最小)除非换成0后它的最大值比区间最小值还要小,就

是说当前位后面所有位都为1也比最小值小。

以后做题好好想想

贴代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<vector>
#include<set>
#include<string>
#include<algorithm>

using namespace std;

int main()
{
	long long int m,t,temp,i,n,L,U;
	while(cin >> n >> L >> U)
	{
			m = 0;
		for(i=31; i>=0; i--)
		{
			t = (long long )1 << i;//只把以为只为1,可以用来判断某一位是1还是0
			temp = (m|t);//将该位置为1
			if((n&t)==0)
			{
				if(temp <= U)//如果该位是0且为1后比区间最大值小
					m = temp;
			}
			else
			{
				if(m+t-1 < L)//如果该位是1且置为0后能达到的最大值比区间最小值要小就置为1否则置为0
					m = temp;
			}
		}
		cout << m << endl;
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 18:31:48

uva 10718 Bit Mask(位操作贪心)的相关文章

uva 10718 Bit Mask (位运算)

uva 10718 Bit Mask 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

UVA 10718 Bit Mask

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define sc3(x,y,z) scanf("%lld%lld%lld", &x, &y, &z) 6 #define pf(x) printf("%lld\n",x) 7 #define FOR(i,b,e) fo

uva 1521 - GCD Guessing Game(贪心)

题目链接:uva 1521 - GCD Guessing Game 题目大意:给定一个数N,现在又一个数x,在1~N之间,现在每次可以猜一个数a,返回gcd(x,a),问说最少猜几次可以确定x. 解题思路:其实就将1~N里面的素数都要考虑一遍,因为有一个N的限制,所以每次选出来的素数的积不大于N即可. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const

uva 10026 Shoemaker&#39;s Problem(贪心+排序)

虽然是个水题,但是在一些细节上wa了几次,好像不支持'\b'退格符号,我用在了输出空格那,结果wa了...白白 wa了几次...题意是看的题解..今天只写了两道题,速度有点慢,得加快了,以后得先认真读懂题目,题目读懂了 就相当于做出来一半然后仔细动脑想想,有想法了再敲,不能盲目的做题.另外,热烈祝贺今天c++ primer看到 了100页 思路: 这道题是让给的数据是每件工作需要做的天数和每耽误一天所需要的费用,让求一个序列使得付费最小,如果有相同答 案把字典树最小的输出...输出的是序号,该件

uva 1016 - Silly Sort(置换+贪心)

题目链接:uva 1016 - Silly Sort 题目大意:给定一个长度为n的序列,每次操作可以交换任意两个数的位置,代价为两个数的和,求最小代价,将序列排成有序的. 解题思路:给定序列根据数的大小映射成一个置换,分解置换的循环,对于每个循环中,肯定是用值最小的逐个去交换的代价最小,但是要考虑,可以将最小的值与序列中最小值交换,用它代替去交换,最后再换回来.取两种情况中最优的. #include <cstdio> #include <cstring> #include <

uva 714 - Copying Books(贪心 最大值最小化 二分)

题目描述开头一大堆屁话,我还仔细看了半天..其实就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,如果最小值相同情况下有多种分配方案,输出前面份数小的,就像字典序输出从小到大一样的意思. 这里用到贪心的方法,定义f(x)为真的条件是满足x为最大值使n本书分成k份,那么就是求x的最小值.如何确定这个x就是用的二分法,x一定大于0小于所有值的合,不断的二分再判断是否成立,成立就取左半边,不成立说明太小了就取右半边,写的时候还是没有把二分法理解透彻,我还怕会丢失

uva:10670 - Work Reduction(贪心)

题目:10670 - Work Reduction 题目大意:给出n, m, L.n代表老板给的全部的paperworks的数量,m代表最终剩下的数量,L代表由这么多家公司需要你来计算最小的花费. 解题思路: 1.L家公司l行.每行由公司的名字 :A,B: A代表一份paperwork需要的money,B则代表帮你减少到总共的paperworks的数量一半要话费的money.注意这里是你手头上有的paperworks而不是老板要求你完成的数量,之前在这里卡了好久.还有减半不能导致最终的数量小于m

uva:10602 - Editor Nottoobad(贪心)

题目:10602 - Editor Nottoobad 题目大意:有一个机子它由press的动作还有copy和delete字符的动作.给一组字符串,问要输入这样的一组字符串,最少要执行的press动作. 解题思路:将这一组字符串按照ascall码排序后,这样前后两个字符串的相似度是比较高的.然后后一个字符串和前一个字符串相比,看有多少相同的可以copy,就只要统计一下不相同的字符个数.这题比较迷惑人的是题目一直说要求第一个字符串一定要先执行press动作,但是输出却可以任意给一种,不一定是要第一

UVA 1379 - Pitcher Rotation(DP + 贪心)

题目链接:1379 - Pitcher Rotation 题意:n个人,m个敌人,去比赛,有得分,n个人可以重复比,但是每次比完要休息4天,问最大得分 思路:dp[i][j][k][l][x] 表示第场比赛,前一天为j,两天为k,三天为l,四天为x,的最大得分,然后由于只有每个人5天就能用一次,所以对于每个人来说,只有得分前5的会被使用上,所以后4维状态只需要5^4,进行状态转移,不用比赛的情况分开考虑,还有这题内存有限,要用滚动数组优化不然会RE 代码: #include <stdio.h>