思路:
题目要求得到最小的 N N N,而根据 ⌈ N A ⌉ ≥ I \lceil \frac{N}{A}\rceil\geq I ⌈AN⌉≥I 易得: N N N 应该 ≤ I × A \leq I\times A ≤I×A ( N > A × I N\gt A\times I N>A×I 是可以取到的,不过此处是求 N N N 的最小值,所以 N N N 要尽可能小,最理想的是 A < a × i A<a\times i A<a×i。而当 A = 1 A=1 A=1 时,此处取等,故 N N N 应该 ≤ I × A \leq I\times A ≤I×A)。所以我们只需要从 I × A I\times A I×A 向下枚举即可。
时间复杂度
说了这么多,真的有用吗?从 I × A I\times A I×A 向下枚举,不会 T T T 吗?
不会!
主要原因有两个:
- 当 N = ( I − 1 ) × A N=(I-1)\times A N=(I−1)×A 时, N A = I − 1 \frac{N}{A}=I-1 AN=I−1,你再怎么向上取证也没用。而 I I I 的数据范围是 1 ≤ I ≤ 100 1\leq I\leq 100 1≤I≤100
- 即使都循环一遍, I , A I,A I,A 的范围只有 1 ≤ A , I ≤ 100 1\leq A,I \leq 100 1≤A,I≤100, I × A I\times A I×A 最大也就 10000 10000 10000 怎么会超时?
code
#include<bits/stdc++.h>
using namespace std;
int n,a,i;
int main(){
cin>>a>>i;
n=a*i;
while(n!=a*(i-1)&&ceil(n*1.00/a)>=i){//从I*A循环到低,如果N=(I-1)*A,那么就不能满足条件,结束;如果n/a向上取整<i,不符题意,退出。
n--;
}
cout<<n+1;//得出来的n是不符题意的,而n+1是符合的
return 0;
}
可是,这还没有结束
刚刚我们说到了:
当 N = ( I − 1 ) × A N=(I-1)\times A N=(I−1)×A 时, N A = I − 1 \frac{N}{A}=I-1 AN=I−1,你再怎么向上取证也没用。
那么, N = ( I − 1 ) × A + 1 N=(I-1)\times A+1 N=(I−1)×A+1 时, N A > I − 1 \frac{N}{A}>I-1 AN>I−1 吗?答案是肯定的。
所以,我们只需要输出 ( I − 1 ) × A + 1 (I-1)\times A+1 (I−1)×A+1 即可。
code
#include<bits/stdc++.h>
using namespace std;
int a,i;
int main(){
cin>>a>>i;
cout<<a*(i-1)+1;
return 0;
}