ブルーブリッジカップ2017グループB第八C言語の問題解決の地方大会の練習 - I.ポイントのチョコレートを行使**

毎日のブラッシングのタイトル(26)

ブルーブリッジ・カップ第8 C言語のグループBの試合は、省を行使する

問題I:ポイントチョコレート

ここに画像を挿入説明
ここに画像を挿入説明
まず、この問題を見て、データは非常に大きなああ、100000、および限られた資源があり、外観はおそらく動的プログラミングまで、問題になることにします。
チョコレートの子の数への第1の入力ラインへの質問と入力の形式と、それぞれの点の数に幾分類似タイトルは、チョコレートの各部分の次の数行は、長さと幅に対応しています。ここで私は理解しやすいCコードを記述したいと思います

#include<stdio.h>

int main()
{
	int h[100000];
	int w[100000];
	int n, k;
	scanf("%d%d",&n, &k);
	int i;
	for(i = 0; i < n; i++)
	{
		scanf("%d%d",&h[i],&w[i]);
	}

	int cnt = 0, j;

	for(i = 100000; i >= 1; i--)
	{
		cnt = 0;
		for(j = 0; j < n; j++)
		{
			cnt += (h[j] / i) * (w[j] / i);
		}
		if(cnt >= k)
		{
			printf("%d\n",i);
			return 0;
		}		
	}	
	return 0;
} 

ここに画像を挿入説明
タイトルは、リソースのサイズを制限するので、我々は、二分探索法を用いて、コードを最適化する必要がある、として次のように

#include<stdio.h>

int main()
{
	int h[100000], w[100000];
	int mid, l, r;
	l = 1;
	r = 100001;
	int cnt = 0, len = 0, i;
	int n, k;
	scanf("%d %d",&n, &k);
	for(i = 0; i < n; i++)
		scanf("%d %d",&h[i], &w[i]);
	while(l <= r)
	{
		cnt = 0;
		mid = (l + r) / 2;
		for(i = 0; i < n; i++)
		{
			cnt += (h[i] / mid) * (w[i] / mid);
		}
		if(cnt >= k)
		{
			l = mid + 1;
			len = mid;
		}
		else
		{
			r = mid - 1;
		}
	}
	printf("%d\n", len);
	return 0;
}

結果は以下のとおりであります
ここに画像を挿入説明

この質問は見つけるためのバイナリ相関アルゴリズムを説明する必要がある場合目的は、こちらになります説明することで、10以上の親指アップは、私はすぐに次の問題に二分法についてお話します場合は、コメント欄では、このような記事のために1ポイントを控除することができます見つけるためのアルゴリズムは、もちろん、私はブログの更新意志の力の言葉を書いている時点でも、大きく速くなりますと同じように、後にこの知識を言うだろう。もし私の記事のような場合は、トリプルああ、賞賛の懸念に収集ポイントを覚えていてください、サポートのおかげで、次の問題は、よりエキサイティングです!

公開された40元の記事 ウォン称賛7 ビュー3109

おすすめ

転載: blog.csdn.net/qq_44631615/article/details/104683736