【二分笔记】[poj 2456]Aggressive cows

来源:互联网 发布:淘宝网店怎么激活 编辑:程序博客网 时间:2024/06/10 20:34

关于二分得到整数答案的使用。

首先要保证答案一定要在区间当中。

while ()中条件为right > left。因为区间长度为一时mid就是答案。

mid可以是(left + right)/ 2,这样right-left=1时mid=left。 也可以是(left + right + 1) / 2,这样right-left=1时mid=right。

如果一段连续区间都满足条件,可以通过mid控制取最左边的还是最右边的数。

例题代码:该题是取最右边的数。

#include <algorithm>#include <string>#include <queue>#include <map>#include <cstdio>#include <cmath>#include <algorithm>#include <iostream>using namespace std;int *s,n,a;int js(int x){int ans = 1;int lens = 0;for (int i = 1; i < n; i++){lens += s[i];lens -= s[i - 1];if (lens >= x){ans++;lens = 0;}}return ans;}int main(){cin >> n >> a;s = new int[n];for (int i = 0; i < n; i++){scanf_s("%d",&s[i]);}sort(s,s+n);int left = 0, right = s[n - 1], mid = (left + right + 1) / 2;while (right - left>0){int tmp = js(mid);if (tmp>= a){left = mid;}else{right = mid-1;}mid = (left + right + 1) / 2;}cout << mid << endl;//system("pause");return 0;}


原创粉丝点击