uva10718 - Bit Mask(贪心)

题目:uva10718 - Bit Mask(贪心)

题目大意:给出32位无符号的整数n ,给定边界L和R,要求在这个边界里面找出一个整数,它和N做或运算得到的值最大。

解题思路:要求做或运算得到的值最大,先N化成2进制的数,然后要使得结果最大的话,最好的就是【L,R】里面的某个数M能和N二进制数01互补.

例如: 00000111

那么M最好就是 11111000

当然这个M需要满足【L,R】内。

思路是M先先等于L,将L也转换成二进制数,然后和N的二进制,每一位都进行判断。

如果N的某i位上面是0,而M上对应的位也是0,那么可以考虑将M上的这一位变成1,但是的判断是否M在【L,R】区间内,如果超过了,那么还有一种可能就是为了保全这个位而将后面的位置为0,这样的M与N的结果肯定必保留后面的位的结果要大。

如果N上的某i位是1,而M上对应的也是1,那么根据题意要最小的M,这里就可以考虑是否能去掉这个1,同样也是要保证在LR之间,如果较小了,也还是有一种策略:为了使得M的值更小,并且i位的结果仍然不变,可以将这一位1去掉,而将后面的所有的位全置为1。这样虽然后面可能有不需要的1,但是这个可以后面处理。

一个0一个1就是最好的状态了,不用处理。

要用 long long 。

代码:

#include <stdio.h>
#include <string.h>

const int N = 32;
typedef long long ll;
ll t[N];
bool w1[N], w2[N];
//打表 二进制数每一位的单位
void init () {

	t[0] = 1;
	for (int i = 0; i < N - 1; i++)
		t[i + 1] = t[i] * 2;
}
//拆分成二进制数
void cut (ll n, bool w[]) {

	for (int i = N - 1; i >= 0; i--) {
		if (n >= t[i]) {

			w[i] = 1;
			n -= t[i];
		}
	}
}

ll solve (ll l, ll r) {

	ll ans = l;
	for (int i = N - 1; i >= 0; i--) {

		if (!w1[i] && !w2[i]) {  //都是 0

			if (ans + t[i] <= r)
				ans += t[i];
			else {            

				ll temp = 0;
				for (int j = i - 1; j >= 0; j--)   //计算后面的位是1的
					if (w2[j])
						temp += t[j];
				if (ans + t[i] - temp >= l && ans + t[i] - temp <= r) {

					ans = ans + t[i] - temp;
					for (int j = i - 1; j >= 0; j--)
						w2[j] = 0;
				}
			}
		}

		if (w1[i] && w2[i]) {  //都是1

			if (ans - t[i] >= l)
				ans -= t[i];
			else {

				ll temp = 0;
				for (int j = i - 1; j >= 0; j--)    //计算后面位是0的
					if (!w2[j])
						temp += t[j];
				if (ans - t[i] + temp >= l && ans - t[i] + temp <= r) {

					ans = ans - t[i] + temp;
					for (int j = i - 1; j >= 0; j--)
						w2[j] = 1;
				}
			}
		}
	}
	return ans;
}

int main () {

	ll n, l, r;
	init();
	while (scanf ("%lld%lld%lld", &n, &l, &r) != EOF) {

			memset(w1, 0, sizeof(w1));
			memset(w2, 0, sizeof(w2));
			cut(n, w1);
			cut(l, w2);
			printf ("%lld\n", solve(l, r));
	}
	return 0;
}

uva10718 - Bit Mask(贪心)

时间: 2024-09-19 11:17:05

uva10718 - Bit Mask(贪心)的相关文章

uva--10718+贪心

题意: 输入n,L,U,在L,U之间找一个数M使得n与M按位或的值最大,如果有多个M输出最小的那个. 思路: 将数化成二进制再结合或的性质就可以很容易得到一个贪心的策略:将n化为32位的二进制表示后 对于n中为0的位,使得M对应的二进制位为1.这样显然可以使得n|M值最大,但是同时还要考虑区间的限制: n中二进制为0时,M对应的二进制位取1的条件是:必须保证后面M的最小值小于U,否则取0:n中二进制为1时,如果 M中对应位取0,则必须保证对应的M最大值要大于L,否则就要取1: 代码: #incl

uva 10718 Bit Mask(位操作贪心)

这道题目我没怎么想就去看题解了,原因只是因为我觉得我想不出来,真没有自信啊...唉,真没有钻入题目进去的 恒心...慢慢培养,不能再这样了,不能轻易看题解啊... 分析: 首先题目中已经说了枚举肯定会超时的,所以呢,网上看到的是枚举32比特位,然后和n与,来判断当前位是1还是0, 如果是0的话,就换成1,除非换成1后比区间的最大值还要大.因为换成一能保证最后或的结果最大. 如果是1的话,就换成0(这样能保证结果相同的情况下选的数最小)除非换成0后它的最大值比区间最小值还要小,就 是说当前位后面所

小总结:快速幂+贪心————Bit Mask____UVA 10718 多多去理解去温习哦!

传送门:https://vjudge.net/problem/UVA-10718 Preview: bitstream:a flow of data in binary form. in bit-wise expression:用位表示. Her face was a cold blank mask. 她装出一副冰冷冷毫无表情的样子. perform a bit-wise AND operation. In bit-wise expression, mask is a common term.

Codeforces 1208F Bits And Pieces 位运算 + 贪心 + dp

题意:给你一个序列a, 问a[i] ^ (a[j] & a[k])的最大值,其中i < j < k. 思路:我们考虑对于每个a[i]求出它的最优解.因为是异或运算,所以我们从高位向低位枚举,如果这一位a[i]是0,我们就在a[i]的右边找两个位置让它们按位与起来这位是1.那么,我们贪心的保留可以通过按位与凑出某个二进制数的最靠右的两个位置.这个可以通过dp的方式预处理出来.之后,我们枚举每一个数a[i],先找出它的哪些位是0,之后从高位到低位枚举,判断这一位是否可以变成1.如果之前已经

CodeforcesF2. Complete the Projects (hard version) (贪心+贪心+01背包)

题目链接:传送门 思路: 对于对rating有提升的项目,肯定做越多越好,所以把$b_{i} >= 0$的项目按rating要求从小到大贪心地都做掉,得到最高的rating记为r. 对于剩余的$b_{i} < 0$的项目,因为r的范围很小,在6e4的亚子,可以考虑用01背包来做. 但是直接上01背包会WA,是因为不同项目选择的先后顺序会对结果有影响. 比如现在的r是5,有两个项目,(ai,bi)分别为(3,-3)和(3,-1),如果先做前面的项目,就会导致rating不够做后一个项目. 考虑任

【uva 1615】Highway(算法效率--贪心 区间选点问题)

题意:给定平面上N个点和一个值D,要求在x轴上选出尽量少的点,使得对于给定的每个店,都有一个选出的点离它的欧几里德距离不超过D. 解法:先把问题转换成模型,把对平面的点满足条件的点在x轴的直线上可得到一个个区间,这样就是选最小的点覆盖所有的区间的问题了.我之前的一篇博文有较详细的解释:关于贪心算法的经典问题(算法效率 or 动态规划).代码实现我先空着.挖坑~

【贪心+Treap】BZOJ1691-[Usaco2007 Dec]挑剔的美食家

[题目大意] 有n头奶牛m种牧草,每种牧草有它的价格和鲜嫩度.每头奶牛要求它的牧草的鲜嫩度要不低于一个值,价格也不低于一个值.每种牧草只会被一头牛选择.问最少要多少钱? [思路] 显然的贪心,把奶牛和牧草都按照鲜嫩度由大到小排序,对于每奶牛把鲜嫩度大于它的都扔进treap,然后找出后继. 不过注意后继的概念是大于它且最小的,然而我们这里是可以等于的,所以应该是找cow[i].fresh-1的后继,注意一下…… 1 #include<iostream> 2 #include<cstdio&

POJ1017 Packets(贪心算法训练)

Time Limit: 1000MS          Memory Limit: 10000K          Total Submissions: 51306          Accepted: 17391 Description A factory produces products packed in square packets of the same height h and of the sizes 1*1, 2*2, 3*3, 4*4, 5*5, 6*6. These pro

ZOJ 3946 Highway Project 贪心+最短路

题目链接: http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3946 题解: 用dijkstra跑单元最短路径,如果对于顶点v,存在一系列边(ui,v)使得dis[v]最小(dis[v]表示0到v的距离).这些边能且只能选一条,那么我们自然应该选cost最小的那个边了. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #inc