uva10718 - Bit Mask(贪心)

本文介绍了UVA10718-BitMask问题的解题思路与实现代码。该问题要求在指定范围内找到一个整数,使其与给定整数进行或运算后的结果最大。通过将整数转换为二进制形式,并逐位分析,确定最佳解决方案。

题目: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;
}


内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值