传送门:
两道题思路差不了多少,找到要二分什么,怎么check,问题基本就解决了。
River Hopscotch:
#include <cmath>
#include <cstdio>
#include <iostream>
#include <algorithm>
#define eps 1e-7
using 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-7
using 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."