JZOJ 1725. MATH(math.pas/cpp)

1725. 【10.6NOIP普及模拟】MATH(math.pas/cpp)
(File IO): input:math.in output:math.out

时间限制: 1000 ms  空间限制: 256000 KB  具体限制

Goto ProblemSet

题目描述

小x正在做他的数学作业,可是作业实在太难了。题目是这样的:

1.给定一个含有N个数的数列V。

2.你可以从数列中恰好移除K个数,定义移除后的数列为V’。

3.定义M为V’中任意两个数的差的最大值,m为V’中任意两个数的差的最小值。

4.请你选择删去的K个数,使得M+m最小。

小x的数学十分之差,于是他只能向你求助了。

输入

第一行两个整数N和K。

第二行N个整数Vi。

输出

一行一个整数,为最小的M+m的和。

样例输入

5 2

-3 -2 3 8 6

样例输出

7

数据范围限制

对于60%的数据:3 ≤ N ≤ 2 000

对于100%的数据:

3 ≤ N ≤ 200 000

1 ≤ K ≤ N - 2

-5 000 000 ≤Vi ≤ 5 000 000

提示

【样例解释】

删去-3和-2,得到V’={3,6,8},M=5,m=2,M+m=7。

这题可以反着来想:

因为要删掉k个数,那么就会剩下n-k个数;所以我们只需要枚举这n-k个数即可;

qsort完之后,

可以发现,这n-k个数只有在排完序之后连续时才能使m尽可能最小,所以枚举区间,先枚举开始点,推出结束点,寻找最小n,寻找时如果前面找到最小的n在开始点之前,就重新找,否则可以直接把n和(新出来的结束点与上一个结束点的差)比较更新,计算ans

{
    by @bobble !
                    2017-1-19
}
program math;
const
  inf=‘math.in‘;
  outf=‘math.out‘;
var
   n,k,i,min,ans,sp,ep,mp:Longint;
   a,c:array[1..200000] of longint;

procedure qsort(l,r:longint);
var
   i,j,x,y:longint;
begin
   i:=l;  j:=r;  x:=a[(l+r) div 2];
   repeat
     while a[i]<x do inc(i);
     while x<a[j] do dec(j);
     if not(i>j) then
     begin
        y:=a[i];   a[i]:=a[j];   a[j]:=y;
        inc(i);    j:=j-1;
     end;
  until i>j;
  if l<j then qsort(l,j);
  if i<r then qsort(i,r);
end;

begin
  assign(input,inf);
  assign(output,outf);
  reset(input); rewrite(output);

  readln(n,k);
  for i:= 1 to n do read(a[i]);
  qsort(1,n);

  for i:= 1 to n-1 do
    c[i]:=a[i+1]-a[i];
  mp:=0;
  ans:=maxlongint;
  for sp:= 1 to n-(n-k)+1  do  //sp=start_point;
    begin
        ep:=sp+n-k-1;//end_point
        if mp<sp then
        begin
          min:=maxlongint;
          for i:= sp to ep-1 do
            if c[i]<min then
             begin
                min:=c[i];//min=min_cha
                mp:=i;   //mp=min_piont
             end;
        end       else if c[ep-1]<c[mp] then mp:=ep-1;

        if ans>a[ep]-a[sp]+c[mp] then ans:=a[ep]-a[sp]+c[mp];                 //c[ep]-c[sp]=max!!
    end;

    writeln(ans);
  close(input);
  close(output);
end.
时间: 2025-01-18 23:31:36

JZOJ 1725. MATH(math.pas/cpp)的相关文章

JZOJ 1724. eko(eko.pas/cpp)

1724. [10.6NOIP普及模拟]eko(eko.pas/cpp) (File IO): input:eko.in output:eko.out 时间限制: 1000 ms  空间限制: 256000 KB  具体限制 Goto ProblemSet 题目描述 小x最近终于不用干搬砖的活了,他成为了一名光荣的伐木工人.但伐木工人也不好当,他每天必须至少砍下M米的木材.但小x对此感到毫无压力,因为小y最近给他买了一台崭新的伐木机,可以像野火一样将森林摧毁.但这台伐木机实在太大了,它一次只能将

three.js 源码注释(十七)Math/Math.js

商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发及移动和物联设备研究:数据可视化.GOLANG.Html5.WEBGL.THREE.JS,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 俺也是刚开始学,好多地儿肯定不对还请见谅. 以下代码是THREE.JS 源码文件中Math/Math.js文件的注释. 更多更新在 : https://github.c

Math - Math.sign()

返回一个数字的符号, 指示数字是正数,负数还是零. 此函数共有5种返回值, 分别是 1, -1, 0, -0, NaN. 代表的各是正数, 负数, 正零, 负零, NaN. 传入该函数的参数会被隐式转换成数字类型. Math.sign(3); // 1 Math.sign(-3); // -1 Math.sign("-3"); // -1 Math.sign(0); // 0 Math.sign(-0); // -0 Math.sign(NaN); // NaN Math.sign(&

常用类——File——Random——Math

Date(long date):分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为"历元(epoch)",即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数. java.io.File:文件和目录路径名的抽象表示形式. 构造方法: File(String pathname) 常用的方法: getName()***:返回由此抽象路径名表示的文件或目录的名称 isDirectory()**:测试此抽象路径名表示的文件是否是一个目录,如果是目录返回tr

js MATH

MATH Math 对象用于执行数学任务. 无需创建它,通过把 Math 作为对象使用就可以调用其所有属性和方法. Math 对象属性 var a=Math.E; //输出2.718281828459045,返回算术常量 e,即自然对数的底数 var a=Math.PI; //输出3.141592653589793,返回圆周率 var a=Math.SQRT1_2; //输出0.7071067811865476,返回 2 的平方根的倒数 var a=Math.SQRT2; //输出1.41421

Java math库的总结

java.math.Math类常用的常量和方法: Math.PI 记录的圆周率Math.E记录e的常量Math.abs 求绝对值Math.sin 正弦函数 Math.asin 反正弦函数Math.cos 余弦函数 Math.acos 反余弦函数Math.tan 正切函数 Math.atan 反正切函数 Math.atan2 商的反正切函数Math.toDegrees 弧度转化为角度 Math.toRadians 角度转化为弧度Math.ceil 得到不小于某数的最大整数Math.floor 得到

20170430 math.sqrt函数

sqrt() 方法返回数字x的平方根 语法: import math math.sqrt( x ) 注意:sqrt()是不能直接访问的,需要导入 math 模块,通过静态对象调用该方法. import math # This will import math module print ("math.sqrt(100) : ", math.sqrt(100))print ("math.sqrt(7) : ", math.sqrt(7))print ("mat

java中math的用法

java.math.Math类常用的常量和方法: Math.PI 记录的圆周率 Math.E记录e的常量 Math.abs 求绝对值 Math.sin 正弦函数 Math.asin 反正弦函数 Math.cos 余弦函数 Math.acos 反余弦函数 Math.tan 正切函数 Math.atan 反正切函数 Math.atan2 商的反正切函数 Math.toDegrees 弧度转化为角度 Math.toRadians 角度转化为弧度 Math.ceil 得到不小于某数的最大整数 Math.

常用类Math和Random

java.lang.Math:Math类包含用于执行基本数学运算的方法,如初等指数.对数.平方根.和三角函数 常见的属性:PI:圆周率 常用的方法: *abs():计算绝对值 *ceil(double a):返回最小的(最接近负无穷大)double 值,该值大于等于参数,并等于某个整数.  *floor(double a):返回最大的(最接近正无穷大)double 值,该值小于等于参数,并等于某个整数  *max(double a, double b):返回两个 double 值中较大的一个.