18年9月24日至18年9月30日
题目1:纽约
题目简述
见题面
做法简述
二分
过关状态 WA->AC
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 5005;
multiset<int> s;
int n, a[N], R;
bool check(int w)
{
s.clear();
for (int i = 1; i <= n; i++) s.insert(a[i]);
for (int j = 1; j <= R; j++)
{
int rem = w;
while (!s.empty())
{
auto x = s.upper_bound(rem);
if (x == s.begin()) break;
x--; rem -= *x; s.erase(x);
}
if (s.empty()) return true;
}
return false;
}
int main()
{
cin >> n >> R;
for (int i = 1; i <= n; i++) cin >> a[i];
int lb = -1, rb = 4e6;
while (rb - lb > 1)
{
int mid = lb + rb >> 1;
if (check(mid)) rb = mid; else lb = mid;
}
int ans = rb;
for (int i = rb; i >= rb - 2000; i--)
if (check(i)) ans = i;
cout << ans;
}
每周小结
注意二分单调性的证明