这题感觉可海星a....网上题解包括官方题解的时间复杂度都玄学得一匹,数据比较弱吧....不卡.....
发现一位大佬做法值得学习。
首先要找序列所有数的最大公因数,肯定上界是最小的那个数吧。然后我们排序遍历每一个数,若发现不满足的数,即a[i]%ans>k(不能在k的范围内调整);
那么ans=a[i]/(a[i]/ans+1);这样能最小范围地调整并且省去一些多余的判断,比如ans=8,a[i]=11;ans=11/2=5,可以直接省去中间判断6,7的过程。
此时跳出再判断,当一遍下来不需要再改就满足了。
上代码:
1 #include<bits/stdc++.h> 2 #define maxn 300005 3 using namespace std; 4 int n,k,a[maxn]; 5 void init(){ 6 scanf("%d%d",&n,&k); 7 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 8 sort(a+1,a+n+1); 9 int ans=a[1]; 10 while(1){ 11 bool flag=0; 12 for(int i=1;i<=n;i++){ 13 if(a[i]%ans>k){//不能减到 14 ans=a[i]/(a[i]/ans+1); 15 flag=1; 16 break; 17 } 18 } 19 if(!flag){//所有数都能满足 20 printf("%d",ans); 21 break; 22 } 23 } 24 25 } 26 int main(){ 27 init(); 28 29 return 0; 30 }
原文地址:https://www.cnblogs.com/degage/p/9716651.html
时间: 2024-11-09 10:49:12