2020 CCPC Wannafly Winter Camp Day7

余生长醉 提交于 2020-02-08 04:28:09

K
发现即是求k(k+1)/2>=max(0,b1ka1)+max(0,b2ka2)k*(k+1)/2>=max(0, b1-k*a1)+max(0,b2-k*a2)
单调函数,求出最小满足的k二分即可

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 5;
typedef long long ll;
ll a1, a2, b1, b2;
int main()
{
    scanf("%lld%lld", &a1, &a2);
    int n; scanf("%d", &n);
    ll ans = 1e8;
    for (int i = 0; i < n; ++i) {
    	scanf("%lld%lld", &b1, &b2);

        ll l = 1, r = 1e8;
    	while (l < r) {
    		ll mid = (l + r) / 2;

    		if (mid * (mid + 1) >= 2 * (max(b1 - mid * a1, 0ll) + max(b2 - mid * a2, 0ll)))
    			r = mid;
    		else
    			l = mid + 1;
    	}
    	ans = min(ans, l);
    }
    printf("%lld\n", ans);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!