题目链接:http://codeforces.com/problemset/problem/1301/B

思路:

(1)都是-1的情况

(2)只有一个除-1之外的数

(3)至少有两个除-1之外的不同的数字

对于(3),我们可以得出最大数字和最小数字_max,_min,而我们的答案m和k易得一定是在[_max,_min]中得出,

那么我们当然可以初始化m = (_max-_min)。因为数据范围大,我们可以通过二分来处理这个答案。

我们可以二分mid ∈[L=_min,R=_max],枚举k,然后把k带入原数组,覆盖-1,在这个k的情况下,tmp_m最大是多少,

并且记录tmp_m最大的时候,两个坐标,dx,dy。为什么要记录两个坐标呢,因为我们不知道怎么二分才是最优的,

而我们可以想到,在一个一维坐标上,(x-----------mid--------y),“--"表示距离,dis(max(mid-x,y-mid)) = m,我们想的是

可不可以让m变小,那么我们可以让这个距离尽可能的平分,那么m就最小了。

显然:如果tmp_m<m那么更新m = tmp_m,k = mid。

这里有一种特殊情况(  -1 -1 -1 40 35 -1 35 ),m = (_max-_min)就是答案,所以一开始对k也要初始化一下,显然k = _max or _min都可。

 #include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std; const int N = (int)2e5+,inf = (int)1e9+;
int a[N];
int m,k,l,r,n,mid; void fun(int mid){
int dx,dy,inx_x,inx_y,tmp_m = -;
for(int i = ; i < n; ++i){
if(a[i-] == - && a[i] == -) continue;
dy = a[i] == -? mid : a[i];
dx = a[i-] == -? mid : a[i-];
if(abs(dx-dy) > tmp_m){//tmp_m最大化
tmp_m = abs(dx-dy);
inx_x = i-; inx_y = i;//坐标
}
}
int v = a[inx_x] == - ? a[inx_y] : a[inx_x];
if(v >= mid) l = mid + ;// x-------mid-----------v
else r = mid - ; // v-----------mid------x if(tmp_m < m){//m最小化
m = tmp_m; k = mid;
}
} int main(){ ios::sync_with_stdio(false);
cin.tie(); cout.tie(); int T;
cin >> T;
while(T--){
cin >> n;
int _min = inf,_max = -;
for(int i = ; i < n; ++i){
cin >> a[i];
if(a[i] == -) continue;
_min = min(_min,a[i]);
_max = max(_max,a[i]);
} if(_min == inf && _max == -) cout << << " " << << endl;
else if(_max == _min) cout << << " " << _min << endl;
else{
l = _min,r = _max,mid,k = _min;
m = r-l;
while(l <= r){
mid = (l+r)>>;
fun(mid);
}
cout << m << " " << k << endl;
}
} return ;
}

最新文章

  1. 记一次ss故障
  2. Mac下命令行中用sublime打开指定文件 设置方法
  3. Nmap备忘单:从探索到漏洞利用(Part 5)
  4. cocos2d 创建精灵图
  5. 数组的filter方法
  6. 定位程序问题的方法 -- clwu
  7. 关于将客户端移植到Lua的解决方案设想。
  8. syslog-ng-3.5.6把容器的单核cpu跑满
  9. STL之容器适配器queue的实现框架
  10. HTML5行业现状与未来 - 2016年终大盘点
  11. 编写原生的Node.js模块
  12. JavaScript事件循环(Event Loop)机制
  13. Linux shell中的竖线(|)——…
  14. 20170723-Ioc与AOP
  15. SVN 撤回已提交的代码
  16. Spring4.0之四:Meta Annotation(元注解)
  17. JS产生徐特尔图表
  18. centos7安装python的MySQLdb模块
  19. 在ASP.NET MVC应用程序中随机获取一个字符串
  20. NetBeans 插件开发简介

热门文章

  1. NOI3.1 6377:生日相同 2.0
  2. 从O365中获取users到D365中
  3. Linux 常用工具openssh之ssh-add
  4. 大数据面试题(一)----HADOOP 面试题
  5. kubernetes secret 和 serviceaccount删除
  6. C#系列之算数运算符(四)
  7. Linux防火墙之iptables扩展处理动作
  8. java.lang.NullPointerException at org.apache.jsp.**_jsp.jspInit(**_jsp.java)tomcat启动异常解决方法
  9. Java实现多线程下载,支持断点续传
  10. 国外大神制作的一个很棒的matplotlib 可视化教程