拦截炮弹
作者:
小说家
,
2024-12-22 15:00:36
,
所有人可见
,
阅读 2
// Description
// 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,
// 但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此
// 有可能不能拦截所有的导弹。
// Input
// 第一行输入M表示包含M组测试数据,每组第一个输入N (N<100)表示后面有N个整数,表示导弹依次飞来的高度(雷达给出的高度数据是
// 不大于30000的正整数)。
// Output
// 对于每组输入数据,第一行输出这套系统最多能拦截多少导弹,以及输出如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
// Sample Input
// 2
// 7 300 250 275 252 200 138 245
// 7 181 205 471 782 1033 1058 1111
// Sample Output
// 5 2
// 1 7
#include <iostream>
#include<algorithm>
#include <vector>
#include <queue>
using namespace std;
// const int N = 110;
// int n;
// int a[N];
// int f[N];//dp表示前i个导弹中最多拦截数量
//第一问dp,第二问dp
//其实可以贪心+二分 还没看
int main () {
int M; cin>>M;
while(M--){
int n;
cin >> n;
vector<int> a(n+1,0);
vector<int> f(n+1,0);
for (int i = 1;i <= n;i++) cin >> a[i];
int ans = 0;
for (int i = 1;i <= n;i++) {
f[i] = 1;
for (int j = 1;j < i;j++) {
if (a[j] >= a[i]) f[i] = max (f[i],f[j] + 1);
}
ans = max (ans,f[i]);
}
cout << ans <<" ";
//second question,等价于求最长上升子序列
int sec_ans = 0;
vector<int> ff(n+1,0);
for (int i = 1;i <= n;i++) {
ff[i] = 1;
for (int j = 1;j < i;j++) {
if (a[j] < a[i]) ff[i] = max (ff[i],ff[j] + 1);
}
sec_ans = max (sec_ans,ff[i]);
}
cout << sec_ans <<" ";
cout<<endl;
}
return 0;
}