小美打怪

链接: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;
}
posted @ 2024-01-15 19:17  lipu123  阅读(148)  评论(0)    收藏  举报