zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    jquery 读取 xml 属性等于某值的 方法
    jquery 定时器
    jquery div 滚动条 最底部
    ajax success 不能返回值解决方案 async:false
    wiki 使用说明
    thinkphp 二维码封装函数
    100本书 慢慢来读
    2013 来了
    jquery 解析 xml
    键盘按键 事件
  • 原文地址:https://www.cnblogs.com/degage/p/9716651.html
Copyright © 2011-2022 走看看