POJ 3258:River Hopscotch & POJ 3273:Monthly Expense (二分)

来源:互联网 发布:北京网络推广培训 编辑:程序博客网 时间:2024/06/05 04:23

传送门:

POJ 3258

POJ 3273


两道题思路差不了多少,找到要二分什么,怎么check,问题基本就解决了。


River Hopscotch:

#include <cmath>#include <cstdio>#include <iostream>#include <algorithm>#define eps 1e-7using namespace std;int l, n, m;int pos[50005];bool check(int x){int pre = 0, curr, cnt = 0;for (int i = 1; i < n; i++){if (pos[i] - pos[pre] < x)cnt++;else pre = i;if (cnt > m)return false;}return true;}int main(){cin >> l >> n >> m;pos[0] = 0;n++;for (int i = 1; i < n; i++)scanf_s("%d", &pos[i]);pos[n] = l;n++;sort(pos, pos + n);int lb = 0, rb = l + 1, mid;while (rb - lb > 1){mid = lb + (rb - lb) / 2;if (check(mid))lb = mid;else rb = mid;}cout << lb << endl;return 0;}



Monthly Expense:

#include <cmath>#include <cstdio>#include <iostream>#include <algorithm>#define eps 1e-7using namespace std;int n, m;int money[100005];bool check(int x){int cnt = 0, beg = 0, sum = money[0];for (int i = 0; i < n; i++){if(beg != i)sum += money[i];if (sum > x){cnt++;beg = i;if (money[beg] > x)return false;else sum = money[i];}}cnt++;if (cnt > m)return false;else return true;}int main(){cin >> n >> m;for (int i = 0; i < n; i++)scanf_s("%d", &money[i]);int l = 0, r = 1e9 + 1, mid;while (r - l > 1){mid = l + (r - l) / 2;if (check(mid))r = mid;else l = mid;}cout << r << endl;return 0;}





"So be it."

0 0
原创粉丝点击