由题意得,如果有个人从前往后能找到第一个不低于自己等级的任务,就会接取其后所有任务
那么就可以让输入数据处理成递增数列
例如1 3 5 4 6 2 7 7 3
可以处理成1 3 5 5 6 6 7 7 7
因为进来的成员总是从前往后看,所以只要每次查找剩余的任务里第一个大于等于它的等级的即可
如果没有,接取最后一个
因为处理成递增数列了,所以可以二分查找答案
#include<bits/stdc++.h> using namespace std; int ar[100005]; int main(){ ios::sync_with_stdio(0); cin.tie(0);cout.tie(0); int T,n,m,i,d,ed,ans; cin>>T; while(T--){ cin>>n>>m>>ar[0]; for(i=1;i<n;i++){ cin>>d; ar[i]=max(d,ar[i-1]); } ed=n; for(ans=i=0;ed&&i<m;i++){ cin>>d; d=lower_bound(ar,ar+ed,d)-ar; if(d==ed) ed--; else ed=d; ans++; } for(;i<m;i++) cin>>d; cout<<ans<<' '; } return 0; }