P1044 拦截导弹问题
描述
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。
格式
输入格式
n颗依次飞来的高度(1≤n≤1000)。
输出格式
要拦截所有导弹最小配备的系统数k。
样例
输入样例
389 207 155 300 299 170 158 65
输出样例
2
//*导弹拦截问题 在没有给数组长度时利用c=getchar()!=’\n’ (对于vscode)
//todo 虽然顺序固定了,但是炮是可以继续去搞的
//todo 不对时,检查有没有码错,再检查思路是不是不对
//*其实就是检查有多少个子序列是单调递减
在这里插入代码片
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
//*导弹拦截问题 在没有给数组长度时利用c=getchar()!='\n
'//todo 虽然顺序固定了,但是炮是可以继续去搞的
//todo 不对时,检查有没有码错,再检查思路是不是不对
//*其实就是检查有多少个子序列是单调递减i
nt a[1010];
int main()
{ int i, j, n; n = 0; /*int temp; char c; c = 'a'; while (c != '\n') { cin >> temp; a[n++] = temp; c = getchar(); }*/ while (cin >> a[n]) //! 在湘潭的oj上面要这样输入才对 { n++; } int ans = 0; int mp; //*思路:每次有一组降序就支为0 for (j = 0; j < n; j++) //*从第一个开始向后面找,但是必须是非0的数,当然一开始肯定都不为0 { if (a[j] != 0) { mp = j; //*取一个临时变量 for (i = j + 1; i < n; i++) { if (a[i] <= a[mp] && a[i] != 0) //*若符合降序,不去不为0 ,则将前面的临时变量的值(在前面的,大的)之为0 { a[mp] = 0; mp = i; //*临时变量为下一个数,继续在后面检查是否还有符合降序的数 } } a[mp] = 0; //*不要忘记把这最后一个支为0,否则会干扰其他的降序 ans++; } } printf("%d\n", ans); return 0;}