2 条题解
-
0齐硕 LV 10 @ 2022-07-28 21:36:30
#include<bits/stdc++.h>
using namespace std;#define ll long long int
namespace binary_search
{
ll lower(ll start, ll end, ll target, function<ll(ll)> func)
{
ll l = start, r = end;
while(l<r)
{
ll mid = (l+r)/2;
if(func(mid) < target) l = mid+1;
else r = mid;
}
return l;
}
};void solve()
{
int n;cin>>n;
int a[n+1][2];
for(int i=1;i<=n;i++)
cin>>a[i][0]>>a[i][1];
cout<<binary_search::lower(1, n+1, 1, [&](int x){
int t = 0;
for(int i=1;i<=n;i++)
{
if(a[i][0]>=x-1-t && a[i][1] >=t)
t++;
}
return t<x;
})-1<<'\n';
}
int main()
{
int t;cin>>t;while(t--) solve();
return 0;
} -
02022-01-30 23:44:43@
二分法枚举能邀请的人数\(x \in [1, n]\)并检验。
检验方法:
若邀请x人,则邀请的人中,成绩最好的人,必须满足\(a_i\ge 0, b_i\ge x\)
第二好的人,有\(a_i\ge 1, b_i\ge x-1\)
以此类推,看能不能顺利邀请\(x\)人。#include<bits/stdc++.h> using namespace std; #define ll long long int namespace binary_search { ll lower(ll start, ll end, ll target, function<ll(ll)> func) { ll l = start, r = end; while(l<r) { ll mid = (l+r)/2; if(func(mid) < target) l = mid+1; else r = mid; } return l; } }; void solve() { int n;cin>>n; int a[n+1][2]; for(int i=1;i<=n;i++) cin>>a[i][0]>>a[i][1]; cout<<binary_search::lower(1, n+1, 1, [&](int x){ int t = 0; for(int i=1;i<=n;i++) { if(a[i][0]>=x-1-t && a[i][1] >=t) t++; } return t<x; })-1<<'\n'; } int main() { int t;cin>>t;while(t--) solve(); return 0; }
- 1
信息
- ID
- 1315
- 难度
- 6
- 分类
- (无)
- 标签
- (无)
- 递交数
- 24
- 已通过
- 9
- 通过率
- 38%
- 被复制
- 1
- 上传者