当前位置: 首页 > news >正文

ZOJ-3987 Numbers 2017CCPC秦皇岛站G题 (二进制乱搞、贪心)

题意:

给一个数n和一个数m,让你将n这个数分成m个数(相加为n),且这m个数的or值最小。输出该或值。(n <= 1e1000, m <= 1e100)

思路:

由于让我们输出最小的或值,那么我们不必关心分的过程,直接去构造这个或值就好。因为要求分成m份,我们可以看成n是由m个不同二进制位1组成的。所以首先通过sum不断的从0位向高位加m*2^k次方,直到sum大于等于n停止,然后就可以开始从这个位向低位去构造。对于当前位k,由于是从高位到低位,所以我们肯定更不想选择较高位的1,更想让较低位的1来贡献给n这个数,所以如果从k-1位到0位所有的位都选择m个都不能构造出大于当前n所需要贡献的剩余数值,那么表示必然要选择若干个这第k位的1,而由于我们最终要求得或值,既然必须得用这第k位的贡献,那么我们就让它贡献尽可能多的贡献,从而减少后续所需的贡献。依此贪心下去,必定能构造出n,从而也能求出最终的或值。

复杂度为O(n的二进制位数),由于数较大,只能java大数写了。

代码:

import java.math.BigInteger;
import java.util.Scanner;

public class Main 
{
	public static BigInteger two = BigInteger.valueOf(2);
	public static BigInteger one = BigInteger.ONE;
	public static BigInteger zero = BigInteger.ZERO;
	public static BigInteger n, m;
	public static BigInteger bas[] = new BigInteger[4005];
	public static void init()
	{
		bas[0] = one;
		for(int i = 1; i <= 4000; ++i)
		bas[i] = bas[i-1].multiply(two);
	}
	public static void work()
	{
		BigInteger sum = zero, tmp = n, ans = zero;
		int up = 0;
		for(int i = 0; sum.compareTo(n) < 0; ++i)
		{
			sum = sum.add(m.multiply(bas[i]));
			up = i;
		}
		for(int i = up; i >= 0; --i)
		{
			BigInteger t = bas[i].subtract(one);
			if(t.multiply(m).compareTo(tmp) >= 0) continue;
			BigInteger k = tmp.divide(bas[i]);
			k = k.min(m);
			tmp = tmp.subtract(bas[i].multiply(k));
			ans = ans.add(bas[i]);
		}
		System.out.println(ans);
	}
	public static void main(String[] args) 
	{
		// TODO Auto-generated method stub
		init();
		Scanner cin = new Scanner(System.in);
		int t = cin.nextInt();
		for(int _ = 1; _ <= t; ++_)
		{
			n = cin.nextBigInteger();
			m = cin.nextBigInteger();
			work();
		}
	}
}


继续加油~

相关文章:

  • iOS开发-类簇(Class Cluster)
  • HDU-1350 Taxi Cab Scheme(最小路径覆盖)
  • codeforces-884D Boxes And Balls(思维、三叉哈夫曼树)
  • 设置c++程序的堆栈空间解决栈溢出问题
  • POJ-1932 XYZZY(判正权环路+Warlshell传递闭包)
  • Codeforces 827C DNA Evolution(多维树状数组)
  • larbin是一种开源的网络爬虫/网络蜘
  • Codeforces 855E Salazar Slytherin's Locket(数位dp)
  • JAVA爬虫 WebCollector
  • HDU-6215 Brute Force Sorting(思维、模拟链表)
  • HDU-1719 Friend(公式化简)
  • js如何获取微信版本号
  • HDU-4664 Triangulation(博弈SG打表+类似凸包性质)
  • asp。net5的依赖注入
  • 卡特兰数的初步学习
  • 「面试题」如何实现一个圣杯布局?
  • co模块的前端实现
  • java2019面试题北京
  • Mysql数据库的条件查询语句
  • orm2 中文文档 3.1 模型属性
  • SQLServer之创建数据库快照
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 聊聊flink的TableFactory
  • 应用生命周期终极 DevOps 工具包
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 蚂蚁金服CTO程立:真正的技术革命才刚刚开始
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​io --- 处理流的核心工具​
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (C)一些题4
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (笔试题)合法字符串
  • (分布式缓存)Redis哨兵
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • .jks文件(JAVA KeyStore)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core 中插件式开发实现
  • .Net FrameWork总结
  • .net mvc部分视图
  • .net 托管代码与非托管代码
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • @Service注解让spring找到你的Service bean
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ vulhub漏洞复现篇 ] Apache APISIX 默认密钥漏洞 CVE-2020-13945
  • [2016.7 day.5] T2
  • [AIGC codze] Kafka 的 rebalance 机制
  • [C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [C++]类和对象【下】
  • [Foreman]解决Unable to find internal system admin account