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 }

原文地址:https://www.cnblogs.com/degage/p/9716651.html

时间: 2024-11-09 10:49:12

CF354C Vasya and Beautiful Arrays的相关文章

Codeforces 354C Vasya and Beautiful Arrays[dp+暴力]

题意: 给出n个整数,对每个整数可以减去0-k的任意一个数 求这样操作后,n个数的最大GCD是多少 分析: 我们首先可以知道n个整数中最小的数是多少 而且,最终的答案肯定不大于这个数 这个n个整数中最小的数是答案的上限 然后对于答案的下限 可以肯定的是 1肯定是答案的下限 2呢?3呢?为什么1一定是 其实,0-k+1,都可以作为答案 为什么? 可以把k想象成一个剪刀 对k+1来说,任何数都可以剪掉0-k变成k+1的倍数(任何数模k+1的结果都是0-k) 所以0-k也可以,综上0-k+1都可以,所

Codeforces 132C. Vasya and Beautiful Arrays【DP,dfs】

题目大意: 在一根数轴上有一只机器龟,它能够听从人们给它的指令做出向前走一步(F)和向后转(T)的操作.给出初始操作,你最开始有修改n步指令的权利(每一个指令可以被修改很多次),问在你修改n次之后,海龟离原点的最大距离. 做法: 很直观的想法,尽可能的将T转化为F,也算是一种贪心的做法吧. 我们用dfs(i,j,t,cur),其中i表示当前遍历的命令的序号,j表示从0~i过程中我转换了多少个T,t表示从0~i的序号中总共出现了多少次T,cur表示当前相对于原点的距离(有正有负),dp[i][dr

Restoring Numbers

D. Restoring Numbers Vasya had two arrays consisting of non-negative integers: a of size n and b of size m. Vasya chose a positive integerk and created an n × m matrix v using the following formula: Vasya wrote down matrix v on a piece of paper and p

D. Vasya and Arrays

链接 [http://codeforces.com/contest/1036/problem/D] 题意 给你两个数组长度分别为n,m; 有这么一种操作,用某个数组的某个子区间元素之和代替这个子区间,这样使得数组长度减少,两个数组都可以进行 问你最后两个数组一摸一样的时候,最大数组长度是多少?如果无法使两个数组一摸一样输出-1 分析 先判断开始数组总和是否相等,不相等是不可能最后两个数组一摸一样的#include<bits/stdc++.h> using namespace std; defi

ACdream 1216 Beautiful People(二维上升子序列 O(nlogn))

Beautiful People Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description The most prestigious sports club in one city has exactly N members. Each of its members

[LeetCode] 349 Intersection of Two Arrays &amp; 350 Intersection of Two Arrays II

这两道题都是求两个数组之间的重复元素,因此把它们放在一起. 原题地址: 349 Intersection of Two Arrays :https://leetcode.com/problems/intersection-of-two-arrays/description/ 350 Intersection of Two Arrays II:https://leetcode.com/problems/intersection-of-two-arrays-ii/description/ 题目&解法

Arrays工具类

Arraysd的静态方法能够方便的对数组进行操作,每个方法也加了注释 : 程序: import java.util.*;public class Array{        public static void main(String[] args){                int[]  arr={1,3,4,2};                System.out.println("排序前:");                printArray(arr);//打印原数组

350.求两个数组的交集 Intersection of Two Arrays II

Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2]. Note: Each element in the result should appear as many times as it shows in both arrays. The result can be in any ord

ArrayList&amp;LinkedList&amp;Map&amp;Arrays

Java集合框架 1:集合接口 1.1:Collection接口 Collection接口是构造集合框架的基础.它声明所有类集合都将拥有的核心方法 Boolean add(Object obj) 将obj加入到调用类集合中,加入返回true 否则 返回 false Boolean addAll(Collection c) 将c中所有元素都加入到类集合中,都加入返回true否则 false Void clean() 从调用类集合中删除所有元素 Boolean contains(Object obj