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. Git菜鸟

    1.git 和svn的差异 git和svn 最大的差异在于git是分布式的管理方式而svn是集中式的管理方式.如果不习惯用代码管理工具,可能比较难理解分布式管理和集中式管理的概念.下面介绍两种工具的工 ...

  2. jsp中的一些细节和注意要点。。。。。简记

    一: <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en&quo ...

  3. 计算Linux权限掩码umask值

    创建文件默认最大权限为666 (-rw-rw-rw-),默认创建的文件没有可执行权限x位. 创建目录默认最大权限777(-rwx-rwx-rwx),默认创建的目录属主是有x权限,允许用户进入. 简单的 ...

  4. 用树莓派做FTP服务器

    我为了传输文件方便,所以先简单的做了一个匿名ftp服务器 首先要下载ftp服务器软件 输入 sudo apt-get install vsftpd 安装vsftp 然后编辑 /etc/vsftp.co ...

  5. 分享三个USB抓包软件---Bus Hound,USBlyzer 和-USBTrace【转】

    转自:http://bbs.armfly.com/read.php?tid=15377 Bus Hound官方下载地址:http://perisoft.net/bushound/ Bus Hound ...

  6. Windows+Git+TortoiseGit+COPSSH安装图文教程【转】

    转自:http://blog.csdn.net/aaron_luchen/article/details/10498181/ Windows+Git+TortoiseGit+COPSSH 安装图文教程 ...

  7. Python Requests 小技巧总结

    关于 Python Requests ,在使用中,总结了一些小技巧把,分享下. 1:保持请求之间的Cookies,我们可以这样做. import requests self.session = req ...

  8. 对象存储 - Swift 原理 及 Swift+keystone+dashboard 架构搭建

    1. 原理介绍 Swift 架构.原理及功能: http://www.cnblogs.com/sammyliu/p/4955241.html 总结的很详细也很全面,受益匪浅,感谢分享. 2. keys ...

  9. [ 总结 ] RHEL6/Centos6 使用OpenLDAP集中管理用户帐号

    使用轻量级目录访问协议(LDAP)构建集中的身份验证系统可以减少管理成本,增强安全性,避免数据复制的问题,并提供数据的一致性.

  10. docker从零开始(三)服务初体验docker compose

    决条件 安装Docker 1.13或更高版本. 获取Docker Compose.在适用于Mac的Docker和适用于Windows的Docker上,它已预先安装,因此您可以随意使用.在Linux系统 ...