0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C++ next_combinationの愚直な実装

Last updated at Posted at 2023-11-15
bool next_combination(vector<ll>& v,ll max_num){
    if(v.back()!=max_num){
        v.back()=v.back()+1;
        return true;
    }
    ll pre=max_num+1;
    for(ll i=v.size()-1;i>=0;i--){
        if(v[i]!=pre-1){
            v[i]=v[i]+1;
            for(ll j=i+1;j<v.size();j++){
                v[j]=v[j-1]+1;
            }
            return true;
        }
        pre=v[i];
    }
    return false;
}

Atcoder ABC328E で出題されて解けなかったので,
標準であるnext_permutationみたいに使えるものを書いてみました.
ACコード https://atcoder.jp/contests/abc328/submissions/47591373

考え方
image.png
画像は5C3=10の場合
{1,2,3,4,5}から3つ選ぶ10通りを列挙する方針.
スタートは{1,2,3} max_num=5
・配列の末尾がmax_numより小さければ末尾+=1
・配列の末尾がmax_numであれば,配列を後ろから見ていき,
右に動かせる数字があれば,それを右に動かす.
動かした数より大きい数は左にしきつめる.

画像を上から見てもらうと,この考え方で列挙できています.
コードの実装もこのままです.

型などテンプレート化していないので,ライブラリとして使うなら,
ほかの人が作っているものを使うことをおすすめします.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?