【Noip模拟 20160929】选数

题目描述

现在有一排共N个数,你需要从中选出恰好K个。选出K个数后,计算它们两两差值的绝对值的最小值S。你需要确定选出哪K个,才能最大化这个S。

输入数据

输入第一行两个正整数N、K,含义如上。 输入第二行N个正整数,依次表示这N个数A1~An。0<Ai≤10^9。

输出数据

一行一个正整数,S的最大值。

样例输入

11 5
19 585 29 1111 5868 3331 272 4441 2251 868 581

样例输出

1092

数据范围

对于30%30%的数据,N≤18N≤18。

对于60%60%的数据,N≤20N≤20。

对于80%80%的数据,N≤100N≤100。

对于100%100%的数据,N≤100000,K<=NN≤100000,K<=N

题目分析

话说我们上次的那道题,难度应该是NOIP第六题水平了,双向SPFA负环割边fread读优。我们迎来了一道数论题。我们看完题目,一脸懵逼。然后发现“最大的最小,最小的最大”,发现这是一道整体二分。于是我就一遍AC了这道水题。

代码实现

#include<bits/stdc++.h>
using namespace std;
#define RE register int
#define IL inline
#define N 100001
int n,k,a[N],minn=1e9,maxx;
inline char gc(){
    static char buf[100001],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100001,stdin),p1==p2)?EOF:*p1++;
}template<class T>inline int read(T&x){
    x=0;register char c=gc();
    while(c<48)c=gc();
    while(c>47)x=(x<<1)+(x<<3)+(c^48),c=gc();
}void write(RE x){
    if (x>9)write(x/10);
    putchar(x%10^48);
}inline int check(RE x){
    RE sum=1,temp=a[1];
    for (RE i=2;i<=n;++i)
        if (a[i]>=temp+x) sum++,temp=a[i];
    return sum>=k;
}signed main(){
    freopen("choose.in","r",stdin),freopen("choose.out","w",stdout);
    cin>>n>>k;
    for (RE i=1;i<=n;++i) cin>>a[i],maxx=max(maxx,a[i]),minn=min(minn,a[i]);
    sort(a+1,a+n+1);
    RE r=maxx,l=minn,m,ans=0;
    while(l<=r) check(m=(l+r)>>1)?ans=m,l=m+1:r=m-1;
    write(ans);
    return 0;
}

代码说明

现在二分答案分为很多个流派,我们学校的许多同学是降临派,我是拯救派,我们已经不流行幸存派了。。。

读者:你个SB,还给我扯,三体看多了吧。

就是说在二分的时候几率答案,二分的方法很多,我不予以展开。这道题的难度啊,NOIP的第二题难度,我5分钟A掉。

原文地址:https://www.cnblogs.com/aserrrre/p/10568919.html

时间: 2024-08-30 11:29:49

【Noip模拟 20160929】选数的相关文章

NOIp模拟3 取数游戏

试题描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流取数,取数的规则如下: (1)选择硬币左边或者右边的一条边,并且边上的数非0: (2)将这条边上的数减至任意一个非负整数(至少要有所减小): (3)将硬币移至边的另一端. 如果轮到一个玩家走,这时硬币左右两边的边上的数值都是0,那么这个玩家就输了.如下图,描述的是Alice和Bob两人的对弈过程,其

计蒜客NOIP模拟赛D2T3 数三角形

刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张图的多样性进行打分.一张图的多样性取决于它的同色和异色三角形的个数.具体来说,G 中每有一个三边颜色都互不同的三角形(异色三角形)可以得 3 分,每有一个三边颜色都相同的三角形(同色三角形)则要被扣掉 6 分,其它三角形不得分也不扣分. 现在,请你写一个程序来计算 G 的多样性分数.输入格式 第一行两个正整数 n 和

【Noip模拟 20160929】花坛迷宫

题目描述 圣玛格丽特学园的一角有一个巨大.如迷宫般的花坛.大约有一个人这么高的大型花坛,做成迷宫的形状,深受中世纪贵族的喜爱.维多利加的小屋就坐落在这迷宫花坛的深处.某一天早晨,久城同学要穿过这巨大的迷宫花坛,去探望感冒的维多利加. 整个迷宫可以用N个路口与M条连接两个不同路口的无向通道来描述.路口被标号为1到N,每条通道有各自的长度.整个迷宫一定是连通的,迷宫中可能存在若干个环路,但是,出于美观考虑,每个路口最多只会属于一个简单环路.例如,图1所示的迷宫是非常美观的,但图2则不符合我们的描述,

NOIP 2002提高组 选数 dfs/暴力

1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在,要求你计算出和为素

1008 选数 2002年NOIP全国联赛普及组

1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n).从 n 个整数中任选 k 个整数相加,可分别得到一系列的和.例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34. 现在

NOIP模拟 17.8.18

NOIP模拟17.8.18 A.小菜一碟的背包[题目描述]Blice和阿强巴是好朋友但萌萌哒Blice不擅长数学,所以阿强巴给了她一些奶牛做练习阿强巴有 n头奶牛,每头奶牛每天可以产一定量的奶,同时也需要一定量的草作为饲料对于第 i头奶牛来说,它每天可以产 vi升的奶,同时需要 wi千克的草作为饲料现在来自蚯蚓国的九条可怜想借一些奶牛,使借走的这些奶牛每天的总产奶量最大,但九条可怜很穷,每天最多只能提供W千克的草作为饲料,而且她还需要对付跳蚤国的神刀手,所以她把这个问题交给了阿强巴,不不不……阿

NOIP模拟 6.28

NOIP模拟赛6.28 Problem 1 高级打字机(type.cpp/c/pas) [题目描述] 早苗入手了最新的高级打字机.最新款自然有着与以往不同的功能,那就是它具备撤销功能,厉害吧. 请为这种高级打字机设计一个程序,支持如下3种操作: 1.T x:在文章末尾打下一个小写字母x.(type操作) 2.U x:撤销最后的x次修改操作.(Undo操作) (注意Query操作并不算修改操作) 3.Q x:询问当前文章中第x个字母并输出.(Query操作) 文章一开始可以视为空串. [输入格式]

NOIP模拟17.9.21

NOIP模拟17.9.21 1 任务安排manage.in/.out/.cpp1.1 问题描述你有N 个工作,同一时刻只能做一个任务, 其中每个工作有其所需时间, 及完成的Deadline(截止时间), 问要完成所有工作, 最迟要从什么时候开始.你最早可以从时间0 开始工作.1.2 输入格式第一行一个整数N,表示任务数量接下来n 行,每行两个整数,Ti; Si,分别表示该任务的持续时间和截止时间.1.3 输出格式输出一个整数,表示最晚的开始时间,如果不能完成,输出-1.1.4 样例输入43 58

8.22 NOIP 模拟题

  8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc 4.9.2 fpc 2.6.2 评测环境 64 位 Linux, 3.3GHZ CPU 评测软件 Lemon 评测方式 忽略行末空格和回车 特别注意:c/c++ 选手使用 printf 输出 64 位整数请使用%lld 1 注意事项 A 债务 文件名                            输入文件             输出文件