CF354C Vasya and Beautiful Arrays

这题感觉可海星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 }

猜你喜欢

转载自www.cnblogs.com/degage/p/9716651.html