ZJNU 2351

由题意得,如果有个人从前往后能找到第一个不低于自己等级的任务,就会接取其后所有任务

那么就可以让输入数据处理成递增数列

例如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;
}
原文地址:https://www.cnblogs.com/stelayuri/p/12238940.html