답안 #240980

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
240980 2020-06-22T00:09:24 Z aggu_01000101 Growing Vegetable is Fun 3 (JOI19_ho_t3) C++14
0 / 100
481 ms 757664 KB
#include <iostream>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define INF 100000000
//#define int long long
#define lchild(i) (i*2 + 1)
#define rchild(i) (i*2 + 2)
#define mid(l, u) ((l+u)/2)
#define x(p) p.first
#define y(p) p.second
#define MOD 998244353
#define ordered_set tree<pair<int, int>, null_type,less<pair<int, int>>, rb_tree_tag,tree_order_statistics_node_update>
using namespace std;
int n;
const int N = 401;
int dp[N][N][N][3];
int g[3][N];
int cc[] = {0, 0, 0};
int cmp[N][3];
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>n;
    char c;
    for(int i = 1;i<=n;i++){
        cmp[i][0] = cc[0];
        cmp[i][1] = cc[1];
        cmp[i][2] = cc[2];
        cin>>c;
        if(c=='R') g[0][cc[0]++] = i;
        else if(c=='G') g[1][cc[1]++] = i;
        else g[2][cc[2]++] = i;
    }
    if(n==1){
        cout<<1<<"\n";
    }
    for(int i = 0;i<=n;i++) for(int j = 0;j<=n;j++) for(int k = 0;k<=n;k++) for(int x = 0;x<3;x++) dp[i][j][k][x] = INF;
    for(int i = n-1;i>=1;i--){
        for(int aused = n;aused>=0;aused--){
            for(int bused = n;bused >= 0 ;bused--){
                int cused = i - (aused + bused);
                int ause = INF, buse = INF, cuse = INF;
                if(aused>cc[0] || bused>cc[1] || cused>cc[2]) continue;
                if(cused<0) continue;
                int currind;
                //calculate use[0]
                if(cc[0] > aused) {
                    currind = g[0][aused] + max((int) 0, bused - cmp[g[0][aused]][1]) +
                              max((int) 0, cused - cmp[g[0][aused]][2]);
                    ause = (currind - (i + 1)) + ((i == (n - 1)) ? 0 : dp[i + 1][aused + 1][bused][0]);
                }
                //calculate buse
                if(cc[1] > bused) {
                    currind = g[1][bused] + max((int) 0, aused - cmp[g[1][bused]][0]) +
                              max((int) 0, cused - cmp[g[1][bused]][2]);
                    buse = (currind - (i + 1)) + ((i == (n - 1)) ? 0 : dp[i + 1][aused][bused + 1][1]);
                }
                //calculate cuse
                if(cc[2] > cused) {
                    currind = g[2][cused] + max((int) 0, aused - cmp[g[2][cused]][0]) +
                              max((int) 0, bused - cmp[g[2][cused]][1]);
                    cuse = (currind - (i + 1)) + ((i == (n - 1)) ? 0 : dp[i + 1][aused][bused][2]);
                }

                dp[i][aused][bused][0] = min(buse, cuse);
                dp[i][aused][bused][1] = min(ause, cuse);
                dp[i][aused][bused][2] = min(buse, ause);
            }
        }
    }
    int ans = INF;
    ans = min(ans, (g[0][0] - 1) + dp[1][1][0][0]);
    ans = min(ans, (g[1][0] - 1) + dp[1][0][1][1]);
    ans = min(ans, (g[2][0] - 1) + dp[1][0][0][2]);
    if(ans>=INF) ans = -1;
    cout<<ans<<"\n";
}
//2^(2k - 1) - 2^(k-1)
/*
4 4
RGWR
GRRG
WGGW
WWWR

5 5
RGRGW
GRRGW
WGGWR
RWRGW
RGWGW

20
YYGYYYGGGGRGYYGRGRYG
 */
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 384 KB Output is correct
2 Correct 481 ms 757496 KB Output is correct
3 Correct 466 ms 755292 KB Output is correct
4 Correct 479 ms 757496 KB Output is correct
5 Correct 481 ms 757428 KB Output is correct
6 Correct 470 ms 757624 KB Output is correct
7 Correct 477 ms 755448 KB Output is correct
8 Correct 467 ms 755320 KB Output is correct
9 Correct 470 ms 751608 KB Output is correct
10 Correct 476 ms 757664 KB Output is correct
11 Correct 467 ms 757556 KB Output is correct
12 Correct 116 ms 202872 KB Output is correct
13 Correct 217 ms 357368 KB Output is correct
14 Correct 326 ms 517496 KB Output is correct
15 Incorrect 479 ms 757600 KB Output isn't correct
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -