제출 #226041

#제출 시각아이디문제언어결과실행 시간메모리
226041Ruxandra985Growing Vegetable is Fun 3 (JOI19_ho_t3)C++14
75 / 100
511 ms163112 KiB
#include <bits/stdc++.h>
#define INF 2000000000
using namespace std;

vector <int> v[3];
int dp[410][410][410][3];
char s[430];


int calcul (int nr0 , int nr1 , int nr2 , int curr){

    int poz , st , dr , mid;

    if (curr == 0)
        curr = v[0][nr0];
    else if (curr == 1)
        curr = v[1][nr1];
    else curr = v[2][nr2];

    /// curr e poz initiala

    poz = curr;
    if (!v[0].empty()){
        st = 0;
        dr = nr0 - 1;
        while (st <= dr){
            mid = (st + dr) / 2;
            if (v[0][mid] <= curr)
                st = mid + 1;
            else dr = mid - 1;
        }

        poz += (nr0 - st); /// st = primul mai mare decat curr
    }

    if (!v[1].empty()){
        st = 0;
        dr = nr1 - 1;
        while (st <= dr){
            mid = (st + dr) / 2;
            if (v[1][mid] <= curr)
                st = mid + 1;
            else dr = mid - 1;
        }

        poz += (nr1 - st); /// st = primul mai mare decat curr
    }

    if (!v[2].empty()){
        st = 0;
        dr = nr2 - 1;
        while (st <= dr){
            mid = (st + dr) / 2;
            if (v[2][mid] <= curr)
                st = mid + 1;
            else dr = mid - 1;
        }

        poz += (nr2 - st); /// st = primul mai mare decat curr

    }


    return poz - (nr0 + nr1 + nr2 + 1);
}
int main()
{
    FILE *fin = stdin;
    FILE *fout = stdout;
    int n , i , sum , j , k , sol;
    fscanf (fin,"%d\n",&n);
    fgets (s + 1 , 420 , fin); /// hehe

    for (i = n ; i ; i--){

        if (s[i] == 'R'){
            v[0].push_back(i);
        }
        else if (s[i] == 'G'){
            v[1].push_back(i);
        }
        else {
            v[2].push_back(i);
        }
    }

    reverse(v[0].begin() , v[0].end());
    reverse(v[1].begin() , v[1].end());
    reverse(v[2].begin() , v[2].end());


    /// dp[i][j][k][0 / 1 / 2] = i 0 , j 1 , k 2 , current e 0 / 1 / 2

    for (sum = 1 ; sum <= n ; sum++){

        for (i = 0 ; i <= v[0].size() ; i++){

            for (j = 0 ; j <= v[1].size() && i + j <= sum ; j++){

                k = sum - i - j;
                if (k >= 0 && k <= v[2].size()){
                    dp[i][j][k][0] = dp[i][j][k][1] = dp[i][j][k][2] = INF;
                }

            }

        }

    }

    if (!v[0].empty())
        dp[1][0][0][0] = v[0][0] - 1;

    if (!v[1].empty())
        dp[0][1][0][1] = v[1][0] - 1;

    if (!v[2].empty())
        dp[0][0][1][2] = v[2][0] - 1;

    /// initializari

    sol = 2000000000;

    for (sum = 2 ; sum <= n ; sum++){

        for (i = 0 ; i <= v[0].size() ; i++){

            for (j = 0 ; j <= v[1].size() && i + j <= sum ; j++){

                k = sum - i - j;
                if (k < 0 || k > v[2].size())
                    continue;


                /// acum calculezi propriu zis

                if (i){ /// incerci sa pui 0

                    dp[i][j][k][0] = min(dp[i - 1][j][k][1] , dp[i - 1][j][k][2]) + calcul(i - 1 , j , k , 0);

                }

                if (j){ /// incerci sa pui 1

                    dp[i][j][k][1] = min(dp[i][j - 1][k][0] , dp[i][j - 1][k][2]) + calcul(i , j - 1 , k , 1);

                }

                if (k){ /// incerci sa pui 2

                    dp[i][j][k][2] = min(dp[i][j][k - 1][0] , dp[i][j][k - 1][1]) + calcul(i , j , k - 1 , 2);

                }


                if (sum == n){
                    sol = min( min(sol , dp[i][j][k][0]) , min(dp[i][j][k][1] , dp[i][j][k][2]) );
                }


            }

        }

    }

    if (sol == INF)
        sol = -1;

    if (n == 1)
        sol = 0;

    fprintf (fout,"%d",sol);

    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

joi2019_ho_t3.cpp: In function 'int main()':
joi2019_ho_t3.cpp:96:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0 ; i <= v[0].size() ; i++){
                      ~~^~~~~~~~~~~~~~
joi2019_ho_t3.cpp:98:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (j = 0 ; j <= v[1].size() && i + j <= sum ; j++){
                          ~~^~~~~~~~~~~~~~
joi2019_ho_t3.cpp:101:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if (k >= 0 && k <= v[2].size()){
                               ~~^~~~~~~~~~~~~~
joi2019_ho_t3.cpp:126:24: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (i = 0 ; i <= v[0].size() ; i++){
                      ~~^~~~~~~~~~~~~~
joi2019_ho_t3.cpp:128:28: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (j = 0 ; j <= v[1].size() && i + j <= sum ; j++){
                          ~~^~~~~~~~~~~~~~
joi2019_ho_t3.cpp:131:32: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 if (k < 0 || k > v[2].size())
                              ~~^~~~~~~~~~~~~
joi2019_ho_t3.cpp:71:12: warning: ignoring return value of 'int fscanf(FILE*, const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     fscanf (fin,"%d\n",&n);
     ~~~~~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:72:11: warning: ignoring return value of 'char* fgets(char*, int, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
     fgets (s + 1 , 420 , fin); /// hehe
     ~~~~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...