毎日のブラッシングのタイトル(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;
}
結果は以下のとおりであります