2020 USACO OPEN--Sliver

这篇博客介绍了USACO竞赛中的三道题目,涉及牛群社交距离的最大化问题、有限麦片分配给奶牛的情况以及相互作用的哞粒子问题。通过题目描述、分析和代码展示了解决这些问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

T1

题目描述
由于高传染性的牛传染病 COWVID-19 的爆发,Farmer John 非常担忧他的奶牛们的健康。
为了限制疾病的传播,Farmer John 的 N 头奶牛(2≤N≤10^5)(2≤N≤10
5
)决定践行“社交距离”,分散到农场的各处。农场的形状如一维数轴,上有 M 个互不相交的区间(1≤M≤10^5)(1≤M≤10
5
),其中有可用来放牧的青草。奶牛们想要使她们位于不同的整数位置,每个位置上均有草,并且最大化 D 的值,其中 D 为最近的两头奶牛之间的距离。请帮助奶牛们求出 D 的最大可能值。

输入格式(文件名:socdist.in):
输入的第一行包含 N 和 M。以下 M 行每行用两个整数 a 和 b 描述一个区间,其中 0≤a≤b≤10^180≤a≤b≤10
1
8。没有两个区间有重合部分或在端点处相交。位于一个区间的端点上的奶牛视为在草上。

输出格式(文件名:socdist.out):
输出 D 的最大可能值,使得所有奶牛之间的距离均不小于 D 单位。保证存在 D>0 的解。

输入样例:
5 3
0 2
4 7
9 9
输出样例:
2
取到 D=2 的一种方式是令奶牛们处在位置 0、2、4、6 和 9。

测试点性质:
测试点 2-3 满足 b≤10^5b≤10
5

测试点 4-10 没有额外限制。

分析

先按y从小到大排序(按x也可以),然后二分d即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define ull unsigned ll
int read()
{
   
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x*f;
}
#define debug 1
#define M 100005
int n,m;ll ans;
struct node
{
   
	ll x,y;
} arr[M];
int cmp(node x,node y)
{
   
	return x.y<y.y;
}
int check(ll d)
{
   
	ll pos=-INF;int sum=0;
	for(int i=1; i<=m; )
	{
   
		while(pos+d>arr[i].y)
			if(++i>m) return 0;//没有区间了,不符合 
		pos+=d;
		if(pos<arr[i].x) pos=arr[i].x;//要站在草上 
		if(++sum>=n) return 1;//有n个了,符合 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值