社区讨论

10分求调 注释详细 码风良好

P6281[USACO20OPEN] Social Distancing S参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@mhjkoykl
此快照首次捕获于
2025/11/04 04:08
4 个月前
此快照最后确认于
2025/11/04 04:08
4 个月前
查看原帖
我感觉我的思路应该没问题,请各位大蛇指点:
AC第一个点
大致思路:
二分找距离,在check中判断按照这个距离放牛能放多少只:从第一头牛,第一块草坪开始
如果当前的草坪的终止端点(b[i]b[i])比上头牛的位置(placeplace)加上找的距离(dd)还要大,那就让已经放的牛的数量(cntcnt)加一,上头牛的位置(placeplace)变为当前这头牛的位置(place+dplace+d);
如果上头牛的位置加距离,比这一块草坪的起始点还要小(即跨草坪,而且距离不是最小的)(place+d<a[i]place+d < a[i]),就让上头牛的位置变为这块草坪的起始点,牛数量加一
代码:
CPP
#include <bits/stdc++.h>
using namespace std;
int n,m;
long long a[100010],b[100010],l=1,r=-1;
//a数组:编号为i草坪的左端点 b数组:编号为i草坪的右端点 
//l为二分左端点 r为二分右端点 
bool check(long long d) {//判断d(mid)是否可行 
	long long cnt=1,place=a[1];//初始第一头牛一定在第一块草坪的最左边 cnt为已经放置的牛的数量  
	for (int i=1; i<=m; i++) {//place是上一头牛的位置 
		if (a[i] > place+d) {//如果上头牛的位置加上距离 比这一块草坪的起始端还要小 这头牛就放置在这块草坪的起始点 
			cnt++;
			place=a[i];
		}
		while (place+d <= b[i]) {//找到这一块草坪上还能放多少牛,其中所有牛之间间隔d的距离 (这样才能放的最多) 
			cnt++;
			place+=d;
		}
		if(cnt >= n) return true;//已经放的牛的数量比目标数量n还多(或相等),说明可以放下 
	}
	return false;//所有草坪已经找完,数量仍不够,说明不可以放下 
}

int main() {
	cin >> n >> m;
	for (int i=1; i<=m; i++) {
		cin >> a[i] >> b[i];
		r=max(r,b[i]);//二分右端点为草坪的最大右端点(因为牛不会吃草坪外的水泥) 
	}
	r++;//右端点+1 防止最小距离为最大距离 
	while (l+1 < r) {
		long long mid=(l+r)/2;
		if (check(mid)) l=mid;//如果可以放下说明还能放 ,要变大 
		else r=mid;//如果不可以放下说明不能放,要变小 
	}
	cout << l;//输出 
	return 0;
}
救救我吧qwq

回复

5 条回复,欢迎继续交流。

正在加载回复...