ACM 1 次元配列の基本的な応用問題

タイトルは、
    道路上に長さ L の並木があり、2 本の木の間の距離が 1 メートル、つまり 0、1、2、3、...、L メートルであることを示しています。 、位置はすべてです 木があります;
    地下鉄の建設に使用されるエリアがいくつかあります; エリアは始点と終点で表されます、始点と終点は両方とも整数、整数メートルです; 今エリア内の木 (2 つのエンドポイントを含む) を削除する必要があります。計算は、
    エリア内の木の後に残りの木の数を削除することです。

サンプル入力
    500 3
    150 300
    100 200
    470 471
    サンプル出力: 298

元のプログラムは次のようなものです。

MFC バージョンを実行しましょう。VC6 は新しいダイアログ プロジェクトを作成します。

設計インターフェイスは次のとおりです。

 

エディット ボックスにすべて UINT 型のメンバー変数を追加します。

 

インターフェイスに別のボタンを追加し、ボタンのクリック機能を追加します。

 

m_cnt はエリアの数で、各計算には 1 ~ 4 のエリアを含めることができ、m_cnt に対応するエディット ボックスは 1 ~ 4 にのみ入力できます。

 

次のメンバー変数をダイアログ ボックスのヘッダー ファイルに追加します。

プライベート:
    int a[10000], i, j, m;

a、大容量配列の定義、
i、ループ変数、
m、今回計算される間隔の数。

j、最終結果。

さらに、結果を表示するには、UINT 型のメンバー変数 m_result を追加する編集ボックスをインターフェイスに追加する必要があります。

ダイアログ ボックスの初期化関数 CShutestDlg::OnInitDialog() では、配列 a が初期化され、結果は j になります。

    memset(a, 0, sizeof(a));
    j = 0;

プロジェクトの名前は最も静かです。

ボタンクリック機能、

void CShutestDlg::OnShuCalc() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m = m_cnt;

	//在这次的区间数中循环
	for(int k=0; k<m; k++)
	{
		if(k==0)
		{
			for(i=m_qj1; i<=m_qj2; i++)
			{
			   a[i] = 1;
			}
		}

		if(k==1)
		{
			for(i=m_qj3; i<=m_qj4; i++)
			{
			   a[i] = 1;
			}
		}

		if(k==2)
		{
			for(i=m_qj5; i<=m_qj6; i++)
			{
			   a[i] = 1;
			}
		}

		if(k==3)
		{
			for(i=m_qj7; i<=m_qj8; i++)
			{
			   a[i] = 1;
			}
		}
	}

	for(i=0; i<=m_sum; i++)
	{
	   if(a[i] != 1)
	   {
		  j = j+1;
	   }
	}

	m_result = j;
	UpdateData(FALSE);
}

プログラムを起動し、データを入力してボタンをクリックすると、次のように計算されます。 

 

継続して計算することはできません。別の状況を計算したい場合は、プログラムを再起動する必要があります。

 

 改善する時期があり、入力例外処理を追加します。

おすすめ

転載: blog.csdn.net/bcbobo21cn/article/details/131821563