牛客练习赛63c牛牛的揠苗助长,二分,货仓选址

牛牛的揠苗助长

https://ac.nowcoder.com/acm/contest/5531/C

(货仓选址问题)在数轴上选一点,使得该点到其他点的距离和最小
结论:选择该组数字的中位数即可,
一共n个数,当n为奇数时,中位数【(n+1)/2】,当n为偶数时,a【(n+1)/2】~a【(n+1)/2+1】之内的数皆可

这个题目出现至少,八成就是二分
那么证明下天数是分成两段的
设第x天恰好(最少)满足要求,那么第x+1天,有一个苗增高导致不完美,那么我们可以用减一的办法让它恢复
这样x后面的天都可以变成腕足条件的
所以二分天数是可以的

(这个应该是最短的正常c++代码)
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll n,l,r,mid,a[N],b[N];

bool ok(ll x){
	for(int i=1;i<=n;i++){
		b[i]=a[i]+x/n+(x%n>=i);
	} 
	sort(b+1,b+1+n);
	ll res=0;
	for(int i=1;i<=n;i++) res+=abs(b[i]-b[(n+1)/2]);
	return res<=x;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	l=1, r=1e14;
	while(l<=r){
		mid=(l+r)/2;
		if(ok(mid)) r=mid-1;
		else l=mid+1;
	}
	cout<<l;
	return 0;
}
创作不易点个赞呗


全部评论
第x天,第i个苗在没有牛牛干预的情况下自然生长到的高度
点赞 回复 分享
发布于 2020-05-10 13:21
for(int i=1;i<=n;i++){ b[i]=a[i]+x/n+(x%n>=i); } 这个能解释一下为什么吗
点赞 回复 分享
发布于 2020-05-10 10:34

相关推荐

点赞 评论 收藏
分享
Twilight_m...:经典我朋友XXXX起手,这是那种经典的不知道目前行情搁那儿胡编乱造瞎指导的中年人,不用理这种**
点赞 评论 收藏
分享
看到这个内容真是闹麻了。。。。。。现在有了AI以后很多人面试都会作弊吗?&nbsp;那对老老实实面试的人岂不是不公平....
重生之我要干前端:放宽心,作弊很明显的,面试官也不是傻子,而且这世上更多的肯定是依靠自己的知识的人,所以放宽心提升自己最重要
点赞 评论 收藏
分享
评论
23
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务