上述した第2及び第三瓶ボトルを選択するためのヒントがあります
制限時間10000ミリ秒
メモリ制限131072キロバイト
LinuxのOS
ソースJsoi2009
Tucao
話はこれです:私は、見て、全体の問題解決の問題を言って、問題を発見し、メモ用紙にGCDどのように更新間隔メンテナンス同時に出たくなかった長い時間のために考えて、このツリーのセクションのタイトルを書かなければなりませんでしたイタリアは明らかに間隔最大公約数ですが、顔を見つめ、問題がGCDた場所を確認、しかし、この問題を考えていませんでした - 。だから私は最終的に油を注ぐする方法を知っている,,質問を見つけました。
- [X] BZOJ 2257と燃料ボトル
- [] BZOJ 5028 Z小さなガソリンスタンド
- [] CodeChef DGCDダイナミックGCDは//このトピックは、実際の文字の代わりに数字で表すOJ
庭のブログは、実際に値下げ-DOをサポートしていません。
問題解決のためのアイデア
タイトルは単語と結合する必要があります:\を(K \ leqslant N- \) 。同様の方法は、ダウン火星は少なくとも燃料を支払う減少し減少させることができない、燃料を下げます。私はここで理解しているしていない
小規模なデータ範囲に起因する、\(N- \)最大のみ1K、それぞれ数アップをする(10 ^ 9 \)\、要因の暴力を見つけることが可能である、複雑さがある\(O(N \ SQRT {\マックス{a_iを}})\) 。また、複雑に結合され、直接ようなマップ、すべての要因の発生回数をカウントする必要がある(\ N- \タイムズ\ G SUM(a_iを)\ログ)\、\(G(a_iをが)\)を表し\を( a_iを\)の要素の合計数。
ソース
#include<map>
#include<cstdio>
int n,k;
std::map<int,int> m;//离散化因数
std::map<int,int>::iterator it;
int main()
{
scanf("%d%d",&n,&k);
while(n--)
{
int a;
scanf("%d",&a);
for(int j=1;j*j<=a;j++)//枚举因子
{
if(a%j==0)
{
m[j]++;
if(a!=j*j) m[a/j]++;
}
}
}
for(it=m.end(),it--;it!=m.begin();it--)//一开始居然把这个循环放到了上面那个while里,WA了两发
{
if(it->second>=k)
{
printf("%d\n",it->first);
return 0;
}
}
return 0;
}