bun
Description
因为体育老师很喜欢等差数列,所以他要求学生们站队必须按身高站成等差数列。
但是有些班级的学生无论如何也无法排成等差数列,于是体育老师从食堂买来了两种神
奇的面包。吃一个第一种面包可以使身高增 1,吃一个第二种面包可以使身高减 1。
你的任务是,对于某个班级,帮助老师安排哪些同学食用多少面包。考虑到学生的身体
健康,体育老师希望吃面包最多的学生吃的面包数量尽量少。
Input Format
第一行一个正整数 n,表示学生的数目。
第二行是长度为 n 的整数序列 a, a[i]表示第 i 个学生的身高。由于体育老师使用的奇怪
的身高单位,学生身高可能是负数。可以打乱顺序重新排列。
Output Format
第一行一个整数,表示吃面包最多的学生吃的面包数量。
第二行两个整数,分别表示等差数列的首项和公差,公差不能为负。
如果有多解,输出公差最小的方案。如果还有多解,输出首项最小的方案。
Sample Input (1)
5
-3 -4 -2 -3 3
Sample Output (1)
2
-3 1
Sample Input (2)
5
2 -3 -1 -4 3
第 8 页 共 8 页
Sample Output (2)
1
-4 2
Hint
对于 30%的数据,n<=100,a[i]的绝对值<=1000。
对于 60%的数据,n<=1000,a[i]的绝对值<=100000。
对于 100%的数据,n<=100000,a[i]的绝对值<=1000000。

<法一>记f1为当前需要吃的增高面包的最大的量,f2为当前需要吃的减低面包最大的量。

考虑暴力的情况,枚举公差d,我们可以通过计算f1、f2,再取中位数的方式得到当前的最优首项。

我们把每个d对应的f1、f2打出表来,就可以发现,f1单调递减,f2单调递增,它们两个相交的位置就是答案,二分即可(怕写错,写了分块答案)。

<法二>orz faebdc,我们在枚举d的时候,易发现,d最大不会超过4*max(a[i])/n,否则还不如把a全变0更优,因此暴力就好啦~

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
#define N 100001
int n,a[N],ans=2147483647,b[N],f1,f2,D,X0;
int main()
{
scanf("%d",&n);
if(n<=1000){
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
sort(a+1,a+n+1);
int lim=30000000/n;
f1=f2=0;
for(int i=1;i<=n;++i)
{
b[i]=a[1]-a[i];
if(b[i]>0) f2=max(f2,b[i]);
else f1=max(f1,-b[i]);
}
if(ans>((f1+f2+1)>>1))
{
ans=((f1+f2+1)>>1);
D=0;
if(f1<f2)
X0=a[1]-(((f1+f2+1)>>1)-f1);
else
X0=a[1]+(f1-((f1+f2+1)>>1));
}
for(int d=1;d<=lim;++d)
{
f1=f2=0;
for(int i=2;i<=n;++i)
{
b[i]+=(i-1);
if(b[i]>0) f2=max(f2,b[i]);
else f1=max(f1,-b[i]);
}
if(ans>((f1+f2+1)>>1))
{
ans=((f1+f2+1)>>1);
D=d;
if(f1<f2)
X0=a[1]-(((f1+f2+1)>>1)-f1);
else
X0=a[1]+(f1-((f1+f2+1)>>1));
}
}
printf("%d\n%d %d\n",ans,X0,D);
return 0;
}
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
sort(a+1,a+n+1);
f1=f2=0;
for(int i=1;i<=n;++i)
{
b[i]=a[1]-a[i];
if(b[i]>0) f2=max(f2,b[i]);
else f1=max(f1,-b[i]);
}
if(ans>((f1+f2+1)>>1))
{
ans=((f1+f2+1)>>1);
D=0;
if(f1<f2)
X0=a[1]-(((f1+f2+1)>>1)-f1);
else
X0=a[1]+(f1-((f1+f2+1)>>1));
}
if(f2>=f1)
{
printf("%d\n%d %d\n",ans,X0,D);
return 0;
}
int sz=sqrt(n),last=0;
for(int i=1;last<=n;i+=sz)
{
f1=f2=0;
for(int j=2;j<=n;++j)
{
b[j]+=(i==1?1:sz)*(j-1);
if(b[j]>0) f2=max(f2,b[j]);
else f1=max(f1,-b[j]);
}
if(ans>((f1+f2+1)>>1))
{
ans=((f1+f2+1)>>1);
D=i;
if(f1<f2)
X0=a[1]-(((f1+f2+1)>>1)-f1);
else
X0=a[1]+(f1-((f1+f2+1)>>1));
}
if(f2>=f1)
{
for(int j=2;j<=n;++j)
b[j]-=(i==1?1:sz)*(j-1);
for(int j=last+1;j<=i;++j)
{
f1=f2=0;
for(int k=2;k<=n;++k)
{
b[k]+=(k-1);
if(b[k]>0) f2=max(f2,b[k]);
else f1=max(f1,-b[k]);
}
if(ans>((f1+f2+1)>>1))
{
ans=((f1+f2+1)>>1);
D=j;
if(f1<f2)
X0=a[1]-(((f1+f2+1)>>1)-f1);
else
X0=a[1]+(f1-((f1+f2+1)>>1));
}
if(f2>=f1)
{
printf("%d\n%d %d\n",ans,X0,D);
return 0;
}
}
}
last=i;
}
return 0;
}

【二分答案】【中位数】codeforces 394 bun的更多相关文章

  1. 【二分答案】Codeforces Round #402 (Div. 2) D. String Game

    二分要删除几个,然后暴力判定. #include<cstdio> #include<cstring> using namespace std; int a[200010],n, ...

  2. Codeforces 700A As Fast As Possible(二分答案)

    [题目链接] http://codeforces.com/problemset/problem/700/A [题目大意] 有一辆限载k人速度为v2的车,n个步行速度均为v1的人要通过一段长度为l的距离 ...

  3. Codeforces Round #276 (Div. 1) E. Sign on Fence (二分答案 主席树 区间合并)

    链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: ...

  4. Codeforces Round #425 (Div. 2) Problem C Strange Radiation (Codeforces 832C) - 二分答案 - 数论

    n people are standing on a coordinate axis in points with positive integer coordinates strictly less ...

  5. Codeforces Round #424 (Div. 2, rated, based on VK Cup Finals) Problem D (Codeforces 831D) - 贪心 - 二分答案 - 动态规划

    There are n people and k keys on a straight line. Every person wants to get to the office which is l ...

  6. Codeforces 772A Voltage Keepsake - 二分答案

    You have n devices that you want to use simultaneously. The i-th device uses ai units of power per s ...

  7. Codeforces Round #591 (Div. 2, based on Technocup 2020 Elimination Round 1) C. Save the Nature【枚举二分答案】

    https://codeforces.com/contest/1241/problem/C You are an environmental activist at heart but the rea ...

  8. [Codeforces 1199C]MP3(离散化+二分答案)

    [Codeforces 1199C]MP3(离散化+二分答案) 题面 给出一个长度为n的序列\(a_i\)和常数I,定义一次操作[l,r]可以把序列中<l的数全部变成l,>r的数全部变成r ...

  9. [Codeforces 865C]Gotta Go Fast(期望dp+二分答案)

    [Codeforces 865C]Gotta Go Fast(期望dp+二分答案) 题面 一个游戏一共有n个关卡,对于第i关,用a[i]时间通过的概率为p[i],用b[i]通过的时间为1-p[i],每 ...

随机推荐

  1. 修改firefox默认下载路径

    菜单栏---编辑---首选项--在常规页就可以看到下载设置了

  2. HTML5学习之新增标签

    转自:http://www.cnblogs.com/fly_dragon/archive/2012/05/25/2516142.html 作者:FlyDragon 一.引言 在本节中,笔者将向大家讲述 ...

  3. nginx实时生成缩略图到硬盘上

    现在随着各终端的出现(手机,ipad等平板),以及各种终端的手机分辨率和尺寸都不同,现在手机用户流量都是宝,网上出现了各种各样的生成缩略图功能的架构,有使用php实时生成缩略图的,也有用nginx + ...

  4. EL表达式中获取list长度(JSTL函数用法)

    在jsp页面中不能通过${list.size}取列表长度,而是 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" pref ...

  5. 在ubuntu 上面安装ubuntu touch 模拟器

    Canonical 公司已经发布了一个运行着Unity8和Mir的Ubuntu Touch模拟器.虽然有一些bug,例如在64位的系统上会使系统崩溃,但我们相信这些都会被一 一修复,这篇文章将教大家如 ...

  6. Django-models class Meta:元类

    Django模型之Meta选项详解 Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项, admin 选项等等.   Django模型类的Meta是一个内部类, ...

  7. IPC网络高清摄像机基础知识4(Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别) 【转】

    转自:http://blog.csdn.net/times_poem/article/details/51682785 [-] 一 概念介绍 二 两个疑问 三 RAW和JPEG的区别 1 概念说明 3 ...

  8. git error: unable to write file xxx,git fatal: unable to write new index file

    执行git checkout -- . error: unable to write file mobile/manifest.jsonfatal: unable to write new index ...

  9. 【 Keepalived 】Nginx or Http 主-备模式

    一.主-备模式: 操作系统:centos 6.4 x64 ka1: 192.168.2.10 ka2: 192.168.2.11 vip: 192.168.2.200 ka1-master服务器配置 ...

  10. 一个杀不死的小强,kill进程无效的原因 记录故障排查过程中kill进程无效的分析过程

    今天在处理一个机器异常负载(1000+)的问题,碰到了一个从未碰到过的情况,遇到了一个异常顽固的分子.我使用了所能想到的所有杀进程的方法,却始终无法干掉这个顽固分子,最后终于在谷歌大神的指引下,干掉了 ...