最小インターセプトシステム(貪欲の紹介)

 トピック:

ある国が敵のミサイル攻撃を防御するためにミサイル迎撃システムを開発しましたが、このミサイル迎撃システムには欠点があります。最初の砲弾は任意の高さに達することができますが、後続の各砲弾は前の砲弾を超えることはできません。 。ある日、レーダーが敵のミサイル攻撃を捕らえました。システムはまだ試用段階であるため、システムが1つしかないため、すべてのミサイルを迎撃できない可能性があります。
どうすればよいですか?システムをさらに構築してください。話がとても簡単です。コスト?コストは大きな問題です。だから私は助けを求めています。必要な傍受システムの最小数を計算するのを手伝ってください。

入力

複数のデータセットを入力します。各データセットには、ミサイルの総数(正の整数)、およびミサイルが飛行する高度(レーダーによって提供される高度データは、スペースで区切られた30,000以下の正の整数です)が含まれます。 )

出力

すべてのミサイルを迎撃するためのデータ出力の各セットに対応して、少なくともそのようなミサイル迎撃システムのセットをいくつ装備する必要があるか。

サンプル入力

8 389 207 155 300 299 170 158 65

サンプル出力

2

アイデア:

ミサイルの高さが迎撃システムの高さを決定します

既存の迎撃システムの高さが更新されるたびに、ミサイルの高さ以上の迎撃システムがない場合は、新しい迎撃システムが追加されます。

実装コード:

#include<stdio.h>
#include<string.h>
int a;
int b[100010];
int main()
{
	int n,m;
	while(scanf("%d",&n)!=EOF)
	{
		memset(b,0,sizeof(b));/*初始化数组*/
		m=0;/*拦截系统的个数*/
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a);
			int j; 
			for(j=0;j<=m;j++)/*每次用较小的拦截高度来替换b中的数值*/
			{
				if(b[j]>=a)
				{
					b[j]=a;
					break;
				}
			}
			if(j>m)/*如果所有的拦截系统都不能拦截*/
			{
				b[++m]=a;/*因为每次都是先遍历,再往后追加所以b数组中的数是从小到大排列的*/
			}
		}
		printf("%d\n",m);
	}
 } 

水のブログのもう一つの日常です〜

追加:

欲張りアルゴリズム欲張りアルゴリズムとも呼ばれます)は、問題を解決するときに、常に現在のビューで最良の選択を行うことを意味します。

おすすめ

転載: blog.csdn.net/with_wine/article/details/114012750