题意:给定一些怪物,每天可以选一个勇士进去打怪,每个勇士每天只能打不超过si个怪物,每个勇士只能打能力值≤pi的怪物,问最少多少天打完所有怪物

题解:贪心,每天尽可能多的去打怪,那么存一个对于长度为i的怪物可以用的最大的能力值是多少,每天枚举长度,尽可能长的去打怪即可

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int T,n,m,ans;
int a[200001],mx[200001];
struct node
{
    int p,s;
}b[200001];
bool cmp(const node &T1,const node &T2){return T1.s>T2.s;}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
      for(int i=1;i<=n;i++)mx[i]=0;
      scanf("%d",&n);
      for(int i=1;i<=n;i++)scanf("%d",&a[i]);
      scanf("%d",&m);
      for(int i=1;i<=m;i++)scanf("%d%d",&b[i].p,&b[i].s);
      sort(b+1,b+1+m,cmp);
      int j=1,t=0;
      for(int i=n;i>0;i--)
      {
        while(j<=m && b[j].s>=i)
        {
          t=max(t,b[j].p);
          j++;
        }
        mx[i]=t;
      }
      ans=0;j=1;t=0;
      for(int i=1;i<=n;i++)
      {
        t=max(t,a[i]);
        if(t>mx[j])
        {
          //printf("%d %d %d %d\n",i,j,a[i],mx[j]);
          if(j==1){ans=-1;break;}
          ans++;j=1;i--;t=0;
        }
        else j++;
      }
      if(ans>-1)ans++;
      //for(int i=1;i<=n;i++)printf("%d ",mx[i]);
      printf("%d\n",ans);
    }
    return 0;
}
01-05 19:12