社区讨论
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中判断按照这个距离放牛能放多少只:从第一头牛,第一块草坪开始
如果当前的草坪的终止端点()比上头牛的位置()加上找的距离()还要大,那就让已经放的牛的数量()加一,上头牛的位置()变为当前这头牛的位置();
如果上头牛的位置加距离,比这一块草坪的起始点还要小(即跨草坪,而且距离不是最小的)(),就让上头牛的位置变为这块草坪的起始点,牛数量加一
代码:
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 条回复,欢迎继续交流。
正在加载回复...