1116:ミサイル迎撃
時間制限:1秒メモリ制限:128 MB
送信:4解像度:3
[ 送信 ] [ ステータス ] [ ディスカッションボード ] [プロテクター:外部インポート]
タイトル説明
ある国は敵のミサイル攻撃から身を守るためにミサイル迎撃システムを開発しました。ただし、このミサイル迎撃システムには欠点があります。最初の砲弾はどのような高さにでも到達できますが、後続の各砲弾は前の砲弾より高くなることはできません。ある日、レーダーが敵のミサイル攻撃を捕らえた。システムはまだ試用段階にあるため、システムが1つしかないため、すべてのミサイルを迎撃できない場合があります。
次に、ミサイルの高度を入力し(レーダーによって提供される高度データは30,000以下の正の整数です)、このシステムが傍受できるミサイルの最大数と、すべてのミサイルを傍受するために必要なそのようなミサイル傍受システムの数を計算します。
入る
1行は順番に飛ぶミサイルの高さです。
出力
2本の線は、迎撃可能なミサイルの最大数と、すべてのミサイルを迎撃するために装備するシステムの最小数です。
入力例
389207155300299170158 65
出力例
6 2
分析:
2つの質問の方法は同じです(ただし、奇抜で面倒なように見えます)。つまり、データ全体を昇順と降順で並べ替え、関数を使用して操作を簡略化します。
次の4つの機能の違いを強調します。
lower_bound( begin,end,num)//求数组中(begin到end-1)第一个大于等于num的地址
upper_bound( begin,end,num)//大于
lower_bound( begin,end,num,greater<type>() )//小于等于
upper_bound( begin,end,num,greater<type>() )//小于
コード:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a, ans2 = 1, ans1 = 1, ma[10010] = { 0 }, mi[10010] = { 0 };//ma为降序,mi为升序
cin >> a;
mi[0] = a;
ma[0] = a;
while (scanf("%d", &a) != EOF)
{
if (a<ma[ans1 - 1])
{
ma[ans1] = a;
ans1++;
}
else
{
*upper_bound(ma, ma + ans1, a, greater<int>()) = a;//找出第一个小于a的位置
}
if (a>mi[ans2 - 1])
{
mi[ans2] = a;
ans2++;
}
else
{
*upper_bound(mi, mi + ans2, a) = a;//找出第一个大于a的位置
}
}
cout << ans1 << endl << ans2;
return 0;
}