CodeForces 785C Anton and Fairy Tale

本文介绍了一个使用二分法解决特定资源分配问题的Java实现方案,该方案利用BigInteger来处理大数运算,确保在资源总量超过常规整型变量所能表示范围的情况下仍能正确计算出最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分。

如果$n≤m$,显然只能$n$天。

如果$n>m$,至少可以$m$天,剩余还可以支撑多少天,可以二分计算得到,也可以推公式。二分计算的话可能爆$long$ $long$,上了个$Java$。

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

public class Main 
{
	static Scanner cin = new Scanner(System.in);
	
	static BigInteger sum(BigInteger L,BigInteger R)
	{
		if(L.compareTo(R)>0) return BigInteger.ZERO;
		BigInteger A = L.add(R);
		BigInteger B = R.subtract(L); B = B.add(BigInteger.ONE);
		BigInteger c = A.multiply(B);
		return c.divide(BigInteger.valueOf(2));
	}
	
	public static void main(String []args)
	{
		BigInteger m,n;
		
		n = cin.nextBigInteger();
		m = cin.nextBigInteger();
		
		if(n.compareTo(m)<=0)
		{
			System.out.println(n);
		}
		
		else 
		{
			BigInteger ans = m;
			BigInteger sy = n.subtract(m);
			
			BigInteger hai = BigInteger.ZERO;
			
			BigInteger L = BigInteger.ZERO, R = sy;
			
			boolean pp=false;
			while(L.compareTo(R)<=0)
			{
				BigInteger mid = (L.add(R).divide(BigInteger.valueOf(2)));
				if(sum(ans.add(BigInteger.ONE),ans.add(mid)).compareTo(sy.add(m.multiply(mid)))<0) 
				{
					pp=true;
					hai = mid; 
					L = mid.add(BigInteger.ONE); 
				}
				
				else if(sum(ans.add(BigInteger.ONE),ans.add(mid)).compareTo(sy.add(m.multiply(mid)))==0)
				{
					pp=false;
					hai = mid; 
					L = mid.add(BigInteger.ONE); 
				}
				
				else R = mid.subtract(BigInteger.ONE); 
			}
			
			ans = ans.add(hai);
			
			if(pp == true) ans = ans.add(BigInteger.ONE);
			System.out.println(ans);
			
		}
		
	}
}

转载于:https://www.cnblogs.com/zufezzt/p/6868950.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值