結果

問題 No.190 Dry Wet Moist
ユーザー tottoripapertottoripaper
提出日時 2015-07-02 18:47:14
言語 C++11
(gcc 11.4.0)
結果
WA  
実行時間 -
コード長 1,555 bytes
コンパイル時間 262 ms
コンパイル使用メモリ 39,808 KB
実行使用メモリ 10,624 KB
最終ジャッジ日時 2024-07-07 22:15:45
合計ジャッジ時間 4,228 ms
ジャッジサーバーID
(参考情報)
judge4 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
10,624 KB
testcase_01 AC 2 ms
5,376 KB
testcase_02 WA -
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 WA -
testcase_19 WA -
testcase_20 WA -
testcase_21 WA -
testcase_22 TLE -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:38:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   38 |     scanf("%d", &N);
      |     ~~~~~^~~~~~~~~~
main.cpp:43:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   43 |         scanf("%d", &a);
      |         ~~~~~^~~~~~~~~~

ソースコード

diff #

#include <cstdio>
#include <vector>
#include <algorithm>

int c1[100001], c_1[100001], c0;
int _c1[100001], _c_1[100001];

int count(int c1[100001], int c_1[100001], int c0){
    int res = 0;

    for(int i=100000,j=100000;i>0;i--){
        if(c1[i] == 0){continue;}

        if(j >= 0){
            while(j > 0 && (j >= i || c_1[j] == 0)){j -= 1;}
            if(j == 0){
                res += std::min(c1[i], c0);
                c0 -= std::min(c1[i], c0);
                if(c0 == 0){j = -1;}
            }else{
                res += std::min(c1[i], c_1[j]);
                c_1[j] -= std::min(c1[i], c_1[j]);
            }
        }else{
            while(-j < i && c1[-j] == 0){j += 1;}
            if(-j == i){break;}
            res += std::min(c1[i], c1[-j]);
            c1[-j] -= std::min(c1[i], c1[-j]);
        }
    }

    return res;
}
                                                   

int main(){
    int N;
    scanf("%d", &N);

    c0 = 0;
    for(int i=0;i<2*N;i++){
        int a;
        scanf("%d", &a);

        if(a > 0){
            c1[a] += 1;
        }else if(a == 0){
            c0 += 1;
        }else{
            c_1[-a] += 1;
        }
    }

    int dry, wet, moist = c0 / 2;
    for(int i=1;i<=100000;i++){
        moist += std::min(c1[i], c_1[i]);
    }

    std::copy(c1, c1+100001, _c1);
    std::copy(c_1, c_1+100001, _c_1);
    dry = count(_c_1, _c1, c0);

    std::copy(c1, c1+100001, _c1);
    std::copy(c_1, c_1+100001, _c_1);
    wet = count(_c1, _c_1, c0);    

    printf("%d %d %d\n", dry, wet, moist);
}
0