随便做就好了,不懂二分也能A啊。
我看有人提供过$\mathcal{O}(T_{\text{total}})$复杂度的做法,还是逊了。如果$T_{\text{total}}$很大怎么办,就算我取$10^{10}$,空间时间都不允许了。
我这个用的是$\mathcal{O}(n\log n)$。就按照想的做就好了。
- 把$(t_i, c_i)$放入优先队列(priority_queue基操吧)。
- 从大到小,逐一处理,相同时间,一起处理。同时维护一个$cost$,表示减少$1$个时间需要多少资源。
- $minus$表示这次能减少多少时间
有一个小寄巧,q.push(k, 999999999)
就能自动避免答案小于$k$啦。
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
const int N = 1e5 + 10;
int n, m, k;
priority_queue<pii> q;
int main()
{
scanf("%d%d%d", &n, &m, &k);
for(int i = 1; i <= n; i++)
{
int t, c;
scanf("%d%d", &t, &c);
q.push({t, c});
}
q.push({k, 999999999});
int ans = q.top().first;
int cost = 0;
while(m >= cost)
{
while(!q.empty() && q.top().first == ans)
{
pii item = q.top();
q.pop();
cost += item.second;
}
int mxday = q.top().first;
int minus = min(ans - mxday, m / cost);
ans -= minus;
m -= cost * minus;
}
printf("%d", ans);
}