牛客练习赛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

相关推荐

06-12 17:46
门头沟学院 Java
运营你豪哥:来说重点: ​1.项目前置,时间倒序。​​ 2.​项目描述强化结果与量化效果(STAR原则里的R)。​​ ​3.个人技能精炼,明确掌握程度,突出核心。​​ ​4.增加强有力开头的个人总结部分。​​ 5.​优化教育背景(成绩排名)、合并奖项与活动。​​
听劝,我这个简历该怎么改...
点赞 评论 收藏
分享
评论
23
收藏
分享

创作者周榜

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