Submission #772901

#TimeUsernameProblemLanguageResultExecution timeMemory
772901alontanayArt Class (IOI13_artclass)C++14
84 / 100
471 ms6092 KiB
#include "artclass.h"

#include <bits/stdc++.h>

using namespace std;

double noise(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {
    double res = 1e18;
    const int NOISE_RAD = 25;
    const int PAD = 0;
    for (int er = NOISE_RAD + PAD; er < H - PAD; er++) {
        int sr = er - NOISE_RAD;
        for (int ec = NOISE_RAD + PAD; ec < W - PAD; ec++) {
            int sc = ec - NOISE_RAD;
            double score = 0;
            double rSum = 0, gSum = 0, bSum = 0;
            for (int r = sr; r < er; r++) {
                for (int c = sc; c < ec; c++) {
                    rSum += R[r][c];
                    gSum += G[r][c];
                    bSum += B[r][c];
                    // cout << R[r][c] << " ";
                }
                // cout << endl;
            }
            double aveR = rSum / (NOISE_RAD * NOISE_RAD);
            double aveG = gSum / (NOISE_RAD * NOISE_RAD);
            double aveB = bSum / (NOISE_RAD * NOISE_RAD);
            // cout << aveR << " " << aveG << " " << aveB << " " << sr << " " <<
            // er
            //      << " " << sc << " " << ec << endl;
            for (int r = sr; r < er; r++) {
                for (int c = sc; c < ec; c++) {
                    double difR = (aveR - R[r][c]);
                    double difG = (aveG - G[r][c]);
                    double difB = (aveB - B[r][c]);
                    score += abs(difR) + abs(difG) + abs(difB);
                }
            }
            // cout << score << endl;
            res = min(res, score);
        }
    }
    return res;
}

int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {
    double nos = noise(H, W, R, G, B);
    if (nos < 2500) {
        int blackL = W;
        int blackR = 0;
        int blackU = H;
        int blackD = 0;
        for (int r = 0; r < H; r++) {
            for (int c = 0; c < W; c++) {
                if (R[r][c] + G[r][c] + B[r][c] < 60 && R[r][c] < 50 &&
                    G[r][c] < 50 && B[r][c] < 50) {
                    blackL = min(blackL, c);
                    blackR = max(blackR, c);
                    blackU = min(blackU, r);
                    blackD = max(blackD, r);
                }
            }
        }
        const int PAD = 200;
        // cout << "!" << blackL << " " << W - blackR << " " << blackU << " "
        //      << H - blackD << endl;
        if (blackL < PAD && blackR > W - PAD && blackU < PAD &&
            blackD > H - PAD) {
            return 1;
        } else {
            return 4;
        }
    }
    if (nos > 12000) {
        return 3;
    } else {
        return 2;
    }
    double sumR = 0, sumG = 0, sumB = 0;
    for (int r = 0; r < H; r++) {
        for (int c = 0; c < W; c++) {
            sumR += R[r][c];
            sumG += G[r][c];
            sumB += B[r][c];
        }
    }
    sumR /= (H * W);
    sumG /= (H * W);
    sumB /= (H * W);
    if (sumG > max(sumR, sumB) - 15) {
        return 2;
    }
    srand(time(0));
    vector<int> opts = {1, 4};
    return opts[rand() % 2];
}
#Verdict Execution timeMemoryGrader output
Fetching results...