問題の意味
あなたはn個、その平均を構築している場合、列の最大数の需要構造が異なる番号を持っています。
考え
それは私の考え方を克服するために長い時間がかかりました。
まず、考えることは容易である\(1 \ leftrightarrow。2A-1 \)デジタル対称分布ができているので、\(N- \ leq2a-。1 \)答えが\(\ N-) 、より大きくなっている\は、(図2A -1 \) 。
その後、次の例を見て、何の問題は、そうしてWAを書いていません。
なぜ?これは、考慮することができる\(N- \)場合、大きな:[\ {。。1、\ cdots ,. 1-A、A、A + 1、\ cdots ,. 1. 2A-、\ cdots ??? \} \] \
重要な点はすぐそこということです\(N-(2A-1) \) の位置、ここで埋めるために何ですか?
フルフィル\(\) ?、しかし、充填された場合(\ \ {1、A- 1,2A \} \)を見つけることができ、平均値を変更しないであろうが、より新しい番号、\(\ {2(a) \} \)
それは位置が非常に複雑な非常に抽象的な問題であるこれらの構成バックは、その後、我々は状況が実現可能ではないかもしれないことを確認する方法についてどのように考えるかです。
らしい電流が異なる数で構成されてもよいことが想定\(m個\)が含まれている必要があり、できるだけ多く注文番号番目の\(\ {1 \ cdotsのM \} \)
明らかに\(M = 2A-1 \ ) は、以前に想像理想的な状況です。
次いで、平均合計が等しいので(\回mを\)\ので、検出することができます。
[\(M + 1)\回M \ DIV2-\回M \] と言うこと\(m個\)フルの数の比の和(\ \)はどのくらいパーセント以上、
これらの追加は、我々は左\(NM \)あなたはそれを一緒に考え出すことができるかどうかを確認、行くとで参加することができます番号を。
だから我々は、方程式を検証することができる持っているが単調で、半分が行うことができます。
コード
#include <bits/stdc++.h>
#define _debug(x) cerr<<#x<<" = "<<(x)<<endl;fflush(stdout)
#define cvint const vint &
#define cint const int &
using namespace std;
typedef long long ll;
typedef vector<int> vint;
const int maxn = 505;
const int inf = 0x3F3F3F3F;
const int mod = 1e9 + 7;
int Kase;
int n, a, ans;
inline bool chek(const ll &m) {
// return (m + 1) * m / 2 - m * a <= (n - m) * (a - 1);
return 2ll * n - m <= 2ll * a * n - m * m;
}
int main() {
scanf("%d", &Kase);
while (Kase--) {
scanf("%d %d", &n, &a);
if (n <= 2 * a - 1) {
printf("%d\n", n);
continue;
}
int l = 1, r = n, m;
while (l <= r) {
m = l + r >> 1;
if (chek(m)) {
ans = m;
l = m + 1;
} else {
r = m - 1;
}
}
printf("%d\n", ans);
}
return 0;
}
/*
9
1 2 8 3 7 4 1 2 5
*/