nCr(nCk)通りの組み合わせを羅列する。C++,C#。再帰関数なし。

<>が消えるの忘れてた!

vectorとか使うと消えがちなので型宣言おかしいかも。

そもそも全部だすなら明らかにC++のほうが早かった。
競技プログラミングやるならC++だわこれ。
nとrの数が大きければ大きいほど差は顕著。

ほとんど同じように書いているつもり。
C#の方が重いのは使ってる配列のせいかもしれない。

標準入力前提。
コード
C#

using System;

public class Program{
        
    public static void Main(){
        string[] str = Console.ReadLine().Trim().Split(' ');
        int r = int.Parse(str[0]);
        int n = int.Parse(str[1]);
        int[] selected = new int[r];
        for(int i = 0; i < r; i++)
        {
            selected[i] = i;
        }
        
        while(selected[0] < n - r + 1)
        {
          for(int i=0;i<r;i++){ Console.Write("{0}"+ " ",selected[i]); } Console.WriteLine(); selected[r - 1]++; if(selected[r - 1] > n - 1)
            {
                for(int i = 1; i < r; i++)
                {
                    selected[r - 1 - i]++;
                    
                    if(selected[r - 1 - i] < n - i) { for(int j = i - 1; j >= 0; j--)
                        {
                            selected[r - 1 - j] = selected[r - 1 - j - 1] + 1;
                        }
                        break;
                    }
                }
            }
        }
    }
}

C++

#include <bits/stdc++.h>
using namespace std;
    int main(void){
        int n,r;
      cin >> r >> n;
      vector<int> selected(r);
      for(int i=0;i<r;i++){
        selected[i] = i;
      }
      //cout << n - r + 1 << " " << n << " " << r;
      while(selected[0] < n - r + 1){
        for(int i=0;i<r;i++){
          cout << selected[i] << " ";
        }
        cout << endl;
        selected[r - 1]++;
        if(selected[r - 1] > n - 1){
          for(int i=0;i<r;i++){
            selected[r - 1 - i]++;
            if(selected[r - 1 - i] < n - i){ for(int j=i-1;j>=0;j--){
                selected[r - 1 - j] = selected[r - 1 - j - 1] + 1;
              }
              break;
            }
          }
        }
      }
    }

インデントがゴミ。
標準入力

r n

nCr のはずなのに r と n を逆に入力するようになっている。

AtCoder のコードテストを借りて実行した結果

r = 10
n = 20

C#
終了コード 0
実行時間 3651 ms
メモリ 29208 KB

C++
終了コード 0
実行時間 394 ms
メモリ 5208 KB

こんなに大きな差になってしまった。
自分のコードの書き方が悪いのかもしれないけど、同じような思考で実装した際の実行速度に差があるのはかわらない。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA