小美打怪
链接:https://ac.nowcoder.com/acm/problem/261577
来源:牛客网
问题
小美在玩游戏,游戏中有\(n\)个怪物,怪物的血量为\(h_i\),攻击力为\(a_i\)。小美的血量为 \(H\),攻击力为 \(A\),小美可以击败血量和攻击力都小于自己的怪物,并且打败后血量降为怪物的血量,攻击力降为怪物的攻击力。小美想知道最多可以打败多少怪物。
输入描述:
第一行三个整数\(n, H, A\),分别表示怪物的数量,小美的血量,小美的攻击力。
第二行 \(n\) 个整数 \(h_i\),表示怪物的血量。
第三行 \(n\) 个整数 \(a_i\),表示怪物的攻击力。
\(1 \leq n \leq 10^3\)
\(1 \leq a_i, h_i, H, A \leq 10^9\)
输出描述:
输出一个整数表示答案。
示例1
输入
3 4 5
1 2 3
3 2 1
输出
1
说明
最多只能击败一个怪物。
这个就是一个最长递增子序列,而且还是可以用\(n^2\)的复杂度写出来。
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1000005;
struct node{
int h,a;
}t[maxn];
int cmp(node a,node b){
if(a.h==b.h) return a.a<b.a;
return a.h<b.h;
}
int f[maxn];
int cnt=0;
int main(){
int n,H,A;
cin>>n>>H>>A;
for(int i=1;i<=n;i++){
cin>>t[i].h;
}
for(int i=1;i<=n;i++){
cin>>t[i].a;
}
for(int i=1;i<=n;i++){
f[i]=1;
}
sort(t+1,t+n+1,cmp);
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(t[i].a>t[j].a&&t[i].h>t[j].h){
f[i]=max(f[i],f[j]+1);
}
}
}
int ma=0;
for(int i=1;i<=n;i++){
if(t[i].a<A&&t[i].h<H){
ma=max(ma,f[i]);
}
}
cout<<ma<<endl;
}