题意:给定一些怪物,每天可以选一个勇士进去打怪,每个勇士每天只能打不超过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; }