思路:
這題很明顯就是二分,感覺自己對二分的理解不夠,導致比賽時調了一個小時還沒有出來。這里我們把整個2*k-1行字符的前綴和當做一個單調遞增的序列,這樣就符合了二分的性質,然后先判斷2*k-1行的和是否超過x,沒有就直接輸出2*k-1,否則二分計算答案,對於每一個mid,我們判斷是否超過k,沒超過的部分和超過的部分分別進行等差數列求和,加起來就是從第一行到這行的總數。
代碼:
#include <bits/stdc++.h> #define ll long long using namespace std; typedef pair<int, int> PII; const int N = 1000, mod = 998244353; ll k, x; int n; int a[N]; //記得開long long ll cal(ll mid) { ll res = 0; if(mid <= k) return (1 + mid) * mid / 2; else { ll sum = (1 + k) * k / 2; res = sum; mid -= k; return res + (k - 1 + k - mid) * mid / 2; } } void solve() { cin >> k >> x; if(cal(2 * k - 1) > x) { ll l = 1, r = 2 * k - 1; while (l < r) { int mid = l + r >> 1; if (cal(mid) >= x) r = mid; else l = mid + 1; } cout << r << endl; return; } cout << 2 * k - 1 << endl; } int main() { ios::sync_with_stdio(0); int T; cin >> T; while(T --) { solve(); } return 0; }