Fair Distribution (整除分块)

Fair Distribution

题目链接
题意 :
梦想王国里有n个机器人和m个能量棒。国王DreamGrid正试图对能量条进行公平分配。当且仅当能量条的数量是机器人数量的倍数时,才存在公平分配。

梦网拥有的唯一工具是一把强大的激光枪。每次他打开激光枪时,他正好可以做两件事中的一件。

创造一个新的能量条。
摧毁一个机器人。
为了避免机器人的灭绝,禁止摧毁所有的N个机器人。开启一次激光枪需要一美元。要求你找出进行公平分配的最小成本。

输入
有多个测试案例。输入的第一行包含一个整数T(1≤T≤1000),表示测试案例的数量。对于每个测试用例。

唯一一行包含两个整数n和m(1≤n,m≤108),表示机器人和能量条的初始数量。

输出
对于每个测试案例输出一行,包含一个整数,表示获得公平分配的最小成本。

思路 :
对于n>m的情况,答案显然为n − m(因为m%n == m,只能把m加到跟n一样大才行)

对于m<n的情况

在这里插入图片描述

AC代码 :

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;

int main(){
    int T;  cin>>T;
    while(T--){
        LL n, m;  cin>>n>>m;
        if(n > m)cout<<n-m<<"\n";
        else{
            LL ans = 1e9+10;
            for(LL l = 1, r; l <= n; l = r+1){
                r = min(n, (m-1)/((m-1)/l));
                ans = min(ans, (m-1)/l*l);
            }
            cout<<ans+n-m<<"\n";
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值