题目连接:
https://codeforces.com/contest/1257/problem/D
题目大意:
n个怪兽,m个英雄,每个怪兽有一定的能力值,每个英雄有一定的能力值和一定的耐力值。耐力值得含义是每天可以击杀怪兽的最多数目。当英雄的能力值大于怪兽的能力值时,英雄可以击杀怪兽,然后问击杀
所有的怪兽所需要的最短时间,如果不能击杀所有怪兽,输出-1;
思路:主要是一个对一个mx数组的理解mx[i]的含义是在耐力值为i的情况下,英雄的最大能力。
#include<bits/stdc++.h> using namespace std; const int N=2E5+7; int arr[N]; int mx[N]; int p[N],abi[N]; void solve(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) mx[i]=0; for(int i=1;i<=n;i++) scanf("%d",&arr[i]); int m; scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d%d",&abi[i],&p[i]); mx[p[i]]=max(mx[p[i]],abi[i]); } //一天可以击杀i个的英雄一定可以击杀i-1个。 //即mx[i]指的是耐力值大于等于i的英雄的最大能力。 for(int i=n-1;i>=1;i--) mx[i]=max(mx[i],mx[i+1]); int day=0,j=1; bool flag=false; for(int i=1;i<=n;){ day++; flag=false ; int maxn=0; int tmp=i; //一天可以击杀的最大数量,找到这几个怪兽的最大能力,然后在mx数组中查找击杀x个怪兽英雄的最大能力。 while(1){ maxn=max(arr[i],maxn); if(maxn>mx[i-tmp+1]) break; i++; flag=true; } if(!flag) break; } if(!flag) day=-1; printf("%d ",day); return ; } int main(){ cin.tie(0); int t; scanf("%d",&t); while(t--) solve(); return 0; }