CF1862D 题解
思路
首先我们来讨论一下最优策略。我们设最终的数字有 种,则这 种数字每种一个能组成 个二元组。最优策略就是用贪心的思路,我们肯定是在 的情况下,让 尽量大,毕竟种数多增长才快。但题目要求正好要 个二元组,那剩下的 是哪里来的呢?自然是有相同数字。如果有两个相同数字,只会增加一对二元组,而如果有更多个相同数字则不会再增加,所以对于每个数字,我们最多只会有两个相同数字,所以答案就是原先的 个再加上剩下的重复数字个数 了。
我们还要计算 。直接从 开始枚举 ,直到不满足 的时候才结束循环的方法肯定会超时,所以我们可以二分答案。
二分的右边界不能直接定 ,因为 ,如果直接定 的话二分 check 的时候 会爆 long long,所以可以使用样例给的最大答案 。
代码
# include <bits/stdc++.h>
typedef long long ll; //不开 ll 见祖宗
using namespace std;
ll t, n, ans, m, l, r, mid;
ll f () {
cin >> n;
m = n * 2;
ans = l = 2, r = 2648956421;
while (l <= r) { //二分
mid = l + r >> 1;
if (mid * (mid - 1) > m)
r = mid - 1;
else
l = mid + 1, ans = mid;
}
return ans + n - ans * (ans - 1) / 2;
}
int main () {
cin >> t;
while (t --)
cout << f () << '\n';
return 0;
}

浙公网安备 33010602011771号