답안 #663385

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
663385 2022-11-26T21:03:43 Z esomer 건포도 (IOI09_raisins) C++17
25 / 100
5000 ms 320 KB
#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define endl "\n"

const int MOD = 1e9 + 7;

ll solve(vector<vector<int>>& table){
    int n = table.size();
    int m = table[0].size();
    ll ans = 0;
    function<void(int, int, int, int)> DFS = [&](int lx, int rx, int ly, int ry){
        cout << "Lx "<< lx << " rx "<< rx << " ly "<< ly << " ry "<< ry << " ans " << ans << endl;
        if(rx - lx == 0 && ry - ly == 0) return;
        int mn = 1e9;
        pair<int, int> cut;
        for(int i = ly; i <= ry; i++){
            for(int j = lx; j <= rx; j++) ans += table[i][j];
        }
        for(int i = ly; i < ry; i++){
            int up = 0;
            int down = 0;
            for(int j = ly; j <= i; j++){
                for(int q = lx; q <= rx; q++) up += table[j][q];
            }
            for(int j = i + 1; j <= ry; j++){
                for(int q = lx; q <= rx; q++) down += table[j][q];
            }
            if(abs(up - down) < mn){
                mn = abs(up - down);
                cut = {i, 0};
            }
        }
        for(int i = lx; i < rx; i++){
            int left = 0;
            int right = 0;
            for(int j = lx; j <= i; j++){
                for(int q = ly; q <= ry; q++) left += table[q][j];
            }
            for(int j = i + 1; j <= rx; j++){
                for(int q = ly; q <= ry; q++) right += table[q][j];
            }
            if(abs(left - right) < mn){
                mn = abs(left - right);
                cut = {i, 1};
            }
        }
        cout << "Cut "<< cut.first << " " << cut.second << " mn "<< mn << endl;
        if(cut.second == 0) {DFS(lx, rx, ly, cut.first); DFS(lx, rx, cut.first + 1, ry);}
        else {DFS(lx, cut.first, ly, ry); DFS(cut.first + 1, rx, ly, ry);}
    };
    DFS(0, m - 1, 0, n - 1);
    return ans;
}

mt19937 gen(time(0));

ll solve2(vector<vector<int>>& table){
    int n = table.size();
    int m = table[0].size();
    function<ll(int, int, int, int)> DFS = [&](int lx, int rx, int ly, int ry){
        if(rx - lx == 0 && ry - ly == 0) return 0;
        ll ans = 1e18;
        for(int i = ly; i < ry; i++){
            ans = min(ans, DFS(lx, rx, ly, i) + DFS(lx, rx, i + 1, ry));
        }
        for(int i = lx; i < rx; i++){
            ans = min(ans, DFS(lx, i, ly, ry) + DFS(i + 1, rx, ly, ry));
        }
        for(int i = ly; i <= ry; i++){
            for(int j = lx; j <= rx; j++) ans += table[i][j];
        }
        return (int)ans;
    };
    return DFS(0, m - 1, 0, n - 1);
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    //freopen("inpt.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);

    //int tt; cin >> tt;
    string s = "RUN";
    if(s == "RUN"){
        int n, m; cin >> n >> m;
        vector<vector<int>> table(n, vector<int>(m));
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++) cin >> table[i][j];
        }
        cout << solve2(table)<< endl;
        return 0;
    }/*
    int tt = 100000;
    for(int t = 1; t <= tt; t++){
        int n = gen() % 2 + 2;
        int m = gen() % 2 + 2;
        vector<vector<int>> table(n, vector<int>(m));
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++) table[i][j] = gen() % 3 + 1;
        }
        ll ans1 = solve(table);
        ll ans2 = solve2(table);
        if(ans1 != ans2){
            cout << n << " "<< m << endl;
            for(auto v : table){
                for(int x: v) cout << x << " ";
                cout << endl;
            }
            cout << "Ans1 "<< ans1 << " ans2 "<< ans2 << endl;
            return 0;
        }
    }*/
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 320 KB Output is correct
4 Correct 1 ms 256 KB Output is correct
5 Correct 91 ms 296 KB Output is correct
6 Execution timed out 5049 ms 212 KB Time limit exceeded
7 Execution timed out 5078 ms 212 KB Time limit exceeded
8 Execution timed out 5098 ms 212 KB Time limit exceeded
9 Execution timed out 5022 ms 212 KB Time limit exceeded
10 Execution timed out 5027 ms 212 KB Time limit exceeded
11 Execution timed out 5051 ms 212 KB Time limit exceeded
12 Execution timed out 5066 ms 212 KB Time limit exceeded
13 Execution timed out 5085 ms 212 KB Time limit exceeded
14 Execution timed out 5072 ms 212 KB Time limit exceeded
15 Execution timed out 5052 ms 212 KB Time limit exceeded
16 Execution timed out 5090 ms 212 KB Time limit exceeded
17 Execution timed out 5076 ms 212 KB Time limit exceeded
18 Execution timed out 5068 ms 212 KB Time limit exceeded
19 Execution timed out 5055 ms 212 KB Time limit exceeded
20 Execution timed out 5042 ms 212 KB Time limit exceeded