A Balanced Problemset?(平衡的问题集?)
时间限制:1.5s 内存限制:256MB
【原题地址】
【问题描述】
杰伊成功地创造了一个难度为 x 的问题,并决定将其作为 Codeforces 第 921 回的第二个问题。
但 Yash 担心这个问题会让比赛变得非常不平衡,协调员会拒绝接受它。因此,他决定把它分解成一个由 n 个子问题组成的问题集,使得所有子问题的难度都是一个正整数,并且它们的总和等于 x 。
协调人阿列克谢将问题集的平衡定义为问题集中所有子问题难度的 GCD。
求如果 Yash 最佳地选择子问题的难度,他能达到的最大平衡。
【输入格式】
第一行输入包含一个整数 t ( 1≤t≤10^3 ),表示测试用例的数量。
每个测试用例包含一行输入,其中包含两个整数 x ( 1≤x≤10^8 ) 和 n ( 1≤n≤x )。
【输出格式】
对于每个测试用例,打印一行,其中包含一个整数,表示 Yash 所能达到的问题集的最大平衡。
【样例输入】
3
10 3
5 5
420 69
【样例输出】
2
1
6
【样例说明】
对于第一个测试用例,一种可能的方法是将难度为 10 的问题分解成一个问题集,该问题集有三个难度分别为 4 、 2 和 4 的问题,使平衡等于 2 。
对于第二个测试用例,只有一种方法是将难度为 5 的问题分解成一个由 5 个问题组成的问题集,每个问题的难度为 1 ,这样平衡就等于 1 。
【解题思路】
老汉使用到的是贪心+暴力枚举的解题方式
本题是求将 x 分成 n 份,所有部分的最大公约数 q ,将 n*q,以 i^2 以分届点进行判断,之后比对对应的小于等于 q 的部分,最大时取到 q 。
代码注释有详细过程
【代码】
package CF1925_B_ABalancedProblemset;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
// 接收题目数据t
int t = scan.nextInt();
// 一共t组数据,分别计算输出结果
while (t-- > 0) {
// 接收数据x
int x = scan.nextInt();
// 接收数据n
int n = scan.nextInt();
// ans用来获取最终答案,初始化为1
int ans = 1;
// 设最终结果最大公约数为q,由题分析可知
// q>=n时,i^2<=x,i<=q
// q<=n时,i^2<=x,i>=q
for (int i = 1; Math.pow(i, 2) <= x; i++) {
// 当i为x的除数时,进行判断为ans赋值
if (x % i == 0) {
// 当q>=n ——> x/i>=q ——> x/i>=n时,得到i<=q,需要存储最大的i,即为最终答案q
if (n <= x / i) {
ans = Math.max(ans, i);
}
// 当q<=n ——> x/i<=q ——> x/i<=n ——> i>=n时,得到x/i<=q,需要存储最大的x/i,即为最终答案q
if (n <= i) {
ans = Math.max(ans, x / i);
}
}
}
// 输出最终答案ans
System.out.println(ans);
}
scan.close();
}
}