有 n 个怪兽和 m 个英雄,每个怪兽有一个能力值 a,每个英雄有一个能力值 p 和 耐力值 s。
每天都要派一个英雄去牢房里清理怪兽,只有当该英雄的能力值大于怪兽的能力值时才可以清理掉这个怪兽,每清理一个怪兽,英雄的耐力值会减 1 ,当耐力值减完或者不能打败这个怪兽时这一天便结束。
问最少要花多少天才能打完所有的怪兽。
选择英雄时,如果两个人的耐力一样,肯定选战力高的,又根据耐力上限,可以构造一个耐力数组,记录在每个耐力值下可以选的最高的战力。f[i-1]=max(f[i-1],f[i]),因为随耐力上升,战力非升,然后从头开始验证每次最多可以前进多少格就行
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=2e5+10;
int t,n,m;
int a[N],p[N],s[N];
int mx[N];
int main()
{
scanf("%d",&t);
while(t--)
{
memset(mx,0,sizeof(mx));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&p[i],&s[i]);
mx[s[i]]=max(mx[s[i]],p[i]);
}
for(int i=n-1;i>=0;i--)
{
mx[i]=max(mx[i],mx[i+1]);
}
int day=0,pos=0;
bool flag=true;
while(pos<n)
{
++day;
int tmp=pos;
int maxn=0;
while(true)//找最多一个英雄可以清几只怪兽
{
maxn=max(maxn,a[tmp]);
if(maxn>mx[tmp-pos+1])
break;
++tmp;
}
if(tmp==pos)
{
flag=false;
break;
}
pos=tmp;
}
if(!flag)
day=-1;
printf("%d\n",day);
}
return 0;
}