ZJNU 2351 - 快乐

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

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

例如1 3 5 4 6 2 7 7 3

可以处理成1 3 5 5 6 6 7 7 7

因为进来的成员总是从前往后看,所以只要每次查找剩余的任务里第一个大于等于它的等级的即可

如果没有,接取最后一个

因为处理成递增数列了,所以可以二分查找答案

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int ar[100005];
 4 int main(){
 5     ios::sync_with_stdio(0);
 6     cin.tie(0);cout.tie(0);
 7     int T,n,m,i,d,ed,ans;
 8     cin>>T;
 9     while(T--){
10         cin>>n>>m>>ar[0];
11         for(i=1;i<n;i++){
12             cin>>d;
13             ar[i]=max(d,ar[i-1]);
14         }
15         ed=n;
16         for(ans=i=0;ed&&i<m;i++){
17             cin>>d;
18             d=lower_bound(ar,ar+ed,d)-ar;
19             if(d==ed)
20                 ed--;
21             else
22                 ed=d;
23             ans++;
24         }
25         for(;i<m;i++)
26             cin>>d;
27         cout<<ans<<'\n';
28     }
29     
30     return 0;
31 }

猜你喜欢

转载自www.cnblogs.com/stelayuri/p/12238940.html