二分アルゴリズム個人総括c++
1961 ワード
二分は比較的に効率的なアルゴリズムで、二分の検索と二分の答えに分けられます
にぶんたんさく
順序付けされた配列で必要な要素の位置を検索し、単一検索複雑度(log 2 n)
思想は自分の値と中間値の大きさを比較して、midより大きくて右区間に2点、midより小さくて左区間に2点、自分の値と左端点の値が等しいまで.
洛谷p 1918ボウリング
コード#コード#
二分の答え
解答によって解答が合理的かどうかを出すことができて、一般的なテーマのキーワードは最大値の最小あるいは最小値の最大で、毎回2点の結果ができるかどうかを判断して、もし記憶して更に優れた解を探し続けることができるならば、一歩下がってできる解を探してはいけません.
洛谷p 1182数列セグメント
コード#コード#
にぶんたんさく
順序付けされた配列で必要な要素の位置を検索し、単一検索複雑度(log 2 n)
思想は自分の値と中間値の大きさを比較して、midより大きくて右区間に2点、midより小さくて左区間に2点、自分の値と左端点の値が等しいまで.
洛谷p 1918ボウリング
コード#コード#
#include
#include
#include
#include
#include
#include
using namespace std;
int n; int k=0;
struct node{
int mark,ball;
}a[100001];
int cmp(node x,node y)
{
return x.balla[mid].ball) l=mid+1;
else r=mid-1;
}
if(a[l].ball==k) cout<>n;
for(int i=1;i<=n;++i)
{
cin>>a[i].ball;
a[i].mark=i;
}
sort(a+1,a+n+1,cmp);
int q;cin>>q;
for(int i=1;i<=q;++i)
{
k=0;
cin>>k;
erfen(1,n);
}
return 0;
}
二分の答え
解答によって解答が合理的かどうかを出すことができて、一般的なテーマのキーワードは最大値の最小あるいは最小値の最大で、毎回2点の結果ができるかどうかを判断して、もし記憶して更に優れた解を探し続けることができるならば、一歩下がってできる解を探してはいけません.
洛谷p 1182数列セグメント
コード#コード#
#include
#include
#include
#include
#include
using namespace std;
int n,m,a[100001],mid;
int maxx=0,all=0,ans;
bool judge(int x)
{ int k=0,cnt=1;
for(int i=1;i<=n;++i)
{ k+=a[i];
if(k>x)
{
cnt++;
k=a[i];
}
}
if(cnt>m) return 0;
else return 1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
{
cin>>a[i];
if(a[i]>maxx) maxx=a[i];
all+=a[i];
}
int l=maxx,r=all;
while(l<=r)
{
mid=(l+r)/2;
if(judge(mid)==1)
{
ans=mid;
r=mid-1;
}
else l=mid+1;
}
cout<