每一次只能出去一架飞机,对答案进行二分
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <bitset>
#define INF 0x3f3f3f3f
#define eps 1e-6
#define PI 3.1415926
#define mod 1000000007
#define base 2333
using namespace std;
typedef long long LL;
const int inf = 1e9;
const int maxn = 5e3 + 10;
const int maxx = 5e6 + 10;
int t, n, a[maxn], b[maxn];
int check(int k) {
int sa = 0, sb = 0, aa = 0, bb = 0, cnt = 0;
for(int i = 0; i < n; i++) {
sa += a[i], sb += b[i];
if(a[i] > k || b[i] > k)
return 0;
while(sa > k) {
if(aa == 0 || cnt == 0)
return 0;
sa--, aa--, cnt--;
}
while(sb > k) {
if(bb == 0 || cnt == 0)
return 0;
sb--, bb--, cnt--;
}
if(aa < sa) aa++;
if(bb < sb) bb++;
if(sa+sb > cnt) cnt++;
}
return 1;
}
void solve() {
scanf("%d", &t);
while(t--) {
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d%d", &a[i], &b[i]);
int l = 1, r = maxn*20, mid;
while(l < r) {
mid = (l+r)>>1;
if(check(mid)) r = mid;
else l = mid+1;
}
printf("%d\n", l-1);
}
}
int main() {
//srand(time(NULL));
//freopen("perechi3.in","r",stdin);
//freopen("perechi3.out","w",stdout);
solve();
}