Submission #1690934


Source Code Expand

// 基本テンプレート

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <cfloat>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <fstream>
#include <functional>
using namespace std;

#define rep(i,a,n) for(int (i)=(a); (i)<(n); (i)++)
#define repq(i,a,n) for(int (i)=(a); (i)<=(n); (i)++)
#define repr(i,a,n) for(int (i)=(a); (i)>=(n); (i)--)
#define int long long int

template<typename T> void chmax(T &a, T b) {a = max(a, b);}
template<typename T> void chmin(T &a, T b) {a = min(a, b);}
template<typename T> void chadd(T &a, T b) {a = a + b;}

typedef pair<int, int> pii;
typedef long long ll;

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
constexpr ll INF = 1001001001001001LL;
constexpr ll MOD = 1000000007LL;

double rec[35][35], p;
int N;
int mat[35][35];
int comb[35][35];

struct Elem {
    int win, rank;
    bool operator<(const Elem &a) const {
        if(win != a.win) return win > a.win;
        return rank < a.rank;
    }
};

vector<Elem> vs;

double func(int a, int b) {
    return 1.0 * comb[a][b] * pow(p, b) * pow(1-p, a-b);
}

double calc(int s, int t) {
    int ma = max(s, t);
    double ret = 0.0;
    repq(u,0,ma) {
        double a = (s < u ? 0.0 : func(s, u));
        double b = ((N-1-s)-(t-u) < 0 ? 0.0 : func(N-1-s, (N-1-s)-(t-u)));
        ret += a * b;
    }
    return ret;
}

double solve(int a, int b) {
    if(rec[a][b] != -1) return rec[a][b];
    if(a == N-1) {
        double val = calc(vs[a].win, b);
        if(b > 0) val += solve(a, b-1);
        return rec[a][b] = val;
    }
    else {
        int rank_a = vs[a].rank, rank_b = vs[a+1].rank;
        int win_orig = vs[a].win;
        double val = 0.0;
        repq(k,0,b) {
            double x = calc(win_orig, k);
            double y = solve(a+1, k-(rank_a>rank_b));
            val += x * y;
        }
        return rec[a][b] = val;
    }
}

signed main() {
    rep(i,0,35) comb[i][0] = 1;
    rep(i,1,35) repq(j,1,i) {
        comb[i][j] = comb[i-1][j-1] + comb[i-1][j];
    }

    scanf("%lld", &N);
    int a, b;
    scanf("%lld/%lld", &a, &b);
    p = (double) a / b;
    rep(i,0,N) rep(j,0,N) cin >> mat[i][j];
    rep(i,0,N) rep(j,0,N) rec[i][j] = -1;

    rep(i,0,N) {
        int rank = i, win = 0;
        rep(j,0,N) win += mat[i][j];
        vs.push_back(Elem{win, rank});
    }
    sort(vs.begin(), vs.end());

    printf("%.12f\n", solve(0, N-1));
    return 0;
}

Submission Info

Submission Time
Task C - 天下一プログラマーコンテスト1999
User tsutaj
Language C++14 (GCC 5.4.1)
Score 600
Code Size 2802 Byte
Status AC
Exec Time 52 ms
Memory 512 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:102:22: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld", &N);
                      ^
./Main.cpp:104:31: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld/%lld", &a, &b);
                               ^

Judge Result

Set Name All
Score / Max Score 600 / 600
Status
AC × 43
Set Name Test Cases
All 00_sample_01, 00_sample_02, 00_sample_03, 00_sample_04, 02_manual_01, 02_manual_02, 02_manual_03, 02_manual_04, 02_manual_05, 02_manual_06, 02_manual_07, 02_manual_08, 02_manual_09, 02_manual_10, 02_manual_11, 02_manual_12, 20_random_00, 20_random_01, 20_random_02, 20_random_03, 20_random_04, 20_random_05, 20_random_06, 20_random_07, 20_random_08, 20_random_09, 20_random_10, 20_random_11, 20_random_12, 20_random_13, 20_random_14, 20_random_15, 20_random_16, 20_random_17, 20_random_18, 20_random_19, 30_manual_13, 30_manual_14, 30_manual_15, 30_manual_16, 30_manual_17, 30_manual_18, 30_manual_19
Case Name Status Exec Time Memory
00_sample_01 AC 4 ms 512 KB
00_sample_02 AC 1 ms 256 KB
00_sample_03 AC 2 ms 384 KB
00_sample_04 AC 1 ms 256 KB
02_manual_01 AC 1 ms 256 KB
02_manual_02 AC 1 ms 256 KB
02_manual_03 AC 1 ms 256 KB
02_manual_04 AC 1 ms 256 KB
02_manual_05 AC 1 ms 256 KB
02_manual_06 AC 1 ms 256 KB
02_manual_07 AC 1 ms 256 KB
02_manual_08 AC 1 ms 256 KB
02_manual_09 AC 1 ms 256 KB
02_manual_10 AC 1 ms 256 KB
02_manual_11 AC 1 ms 256 KB
02_manual_12 AC 1 ms 256 KB
20_random_00 AC 8 ms 256 KB
20_random_01 AC 7 ms 256 KB
20_random_02 AC 3 ms 256 KB
20_random_03 AC 3 ms 256 KB
20_random_04 AC 7 ms 256 KB
20_random_05 AC 5 ms 256 KB
20_random_06 AC 4 ms 256 KB
20_random_07 AC 3 ms 256 KB
20_random_08 AC 4 ms 256 KB
20_random_09 AC 6 ms 256 KB
20_random_10 AC 9 ms 256 KB
20_random_11 AC 5 ms 256 KB
20_random_12 AC 3 ms 256 KB
20_random_13 AC 2 ms 256 KB
20_random_14 AC 2 ms 256 KB
20_random_15 AC 2 ms 256 KB
20_random_16 AC 4 ms 256 KB
20_random_17 AC 4 ms 256 KB
20_random_18 AC 4 ms 256 KB
20_random_19 AC 5 ms 256 KB
30_manual_13 AC 49 ms 256 KB
30_manual_14 AC 25 ms 256 KB
30_manual_15 AC 9 ms 256 KB
30_manual_16 AC 52 ms 256 KB
30_manual_17 AC 21 ms 256 KB
30_manual_18 AC 39 ms 256 KB
30_manual_19 AC 39 ms 256 KB