浙江公商大学の2020年新入生コンペティションのいくつかの質問に対する解決策(2)

浙江公商大学の2020年新入生コンペティションのいくつかの解決策(1)浙江公商大学の2020年新入生競争のいくつかの解決策
(3)

[私のコードスタイルは非常に特殊なので、すべてのコードはコア部分のみを提供し、ヘッダーファイル、名前名、メイン関数部分は提供しません。ロジックを参照するだけで済みます]

立っている神と最も単純な言語

苦情を言う

この問題は問題外です
この質問はウィキペディアから完全にコピーされ、私から貼り付けて、
この問題を見るよりも、ウィキペディアのコンテンツである表面
トピック
です(新しい発見ではありません)質問の作り方)この質問は、当時2番目に難しい質問(つまり、反AK質問を除いて最も難しい質問として評価されました。
ウィキペディア

バックエンドデータは実際には非常に単純です。実際、このWebサイトを使用して生成されます。その結果、バックエンドデータは実際には非常に脆弱です。

回答

トピックに戻ると、一般的な考え方は、BrainFuck言語コンパイラを実装できるようにすることです。
新しい学生の世話をするために、私は意図的に次の特別なケースを削除しました。

  • 無限ループ
  • ネストされた括弧があります(新入生はそれを行う方法を考えることができます)
  • 入力を考慮する必要はありません
  • 括弧が合法かどうかを考慮する必要はありません

先輩がまだとてもいいと突然感じましたか?
それをもっと難しくするために(実際はそうではありません)、私はいくつかの特別な判断を追加しました

この質問の最も難しい部分は、2つのポイントがあるべきだと思います

  • ループの処理方法
  • プログラムエラーが発生した場合の問題への対処方法

括弧の入れ子がないので、前[の場所の場所を記録するだけでよく、それに遭遇]すると、前に保存した場所に直接ジャンプできます。括弧の一致は合法でなければならないため

2番目の質問は、実際、最も便利な解決策は、エラーメッセージを出力した直後にプログラムを使用exit(0);またはreturn 0;終了することです。

結局、実際に渡されるコードの数は多くなく最も難しい質問の期待に応えると考えられています。

ACコード

void solve() {
    
    
    vector<char> data(1, 0);
    int pos = 0;
    int cnt = 0;

    string str;
    cin >> str;

    int miss = 0;
    for (int i = 0; i < str.size(); ++i) {
    
    
        if (miss == -1) {
    
    
            if (str[i] == ']') miss = 0;
            continue;
        }
        if (cnt == 1000000) {
    
    
            cout << "Endless Code" << endl;
            return;
        }
        switch (str[i]) {
    
    
            case '>':
                pos++;
                if (data.size() == pos) data.push_back(0);
                break;
            case '<':
                if (pos == 0) {
    
    
                    cout << "Segment Fault" << endl;
                    return;
                }
                pos--;
                break;
            case '+':
                if (data[pos] == 127) {
    
    
                    cout << "Char Overflow" << endl;
                    return;
                }
                data[pos]++;
                break;
            case '-':
                if (data[pos] == 0) {
    
    
                    cout << "Char Overflow" << endl;
                    return;
                }
                data[pos]--;
                break;
            case '.':
                if ((data[pos] >= 32 && data[pos] <= 126) || data[pos] == 10) {
    
    
                    cout << data[pos];
                    break;
                } else {
    
    
                    cout << "Char Unknown" << endl;
                    return;
                }
            case '[':
                miss = data[pos] ? i : -1;
                break;
            case ']':
                i = miss - 1;
                break;
        }
        cnt++;
    }
}

ZhanShenとSuzhengの合意

苦情を言う

この質問は私が作ったものではありません。本当に私が作ったものではありません。この質問は大きくなります。彼を槌で打って
多くの人のコードを読むだけです。実際、誰もが2000年のカットオフポイントを理解でき、多くの人がいくつかの小さな詳細が適切に処理されず、クレイジーなWAにつながります

この質問を判断するとき、私はそれが最後から2番目の質問だと思いました

回答

最初の2つの艦隊を見てみましょう:「Frigate」(以下A)と「Battleship」(以下B)。この学校に入学できる人は誰でも次の原則を理解する必要があると思います...

必要な戦闘力が50以上の場合\ geq 505 0、Bを選択し、そうでなければ選択

このトピックには、「タイタン」(以下、Cと呼びます)という非常に興味深いものがあります。
これは、艦隊全体の戦闘効果を2倍にすることができますが、時間がかかります。

最適なコストを検討します。つまり、他のすべてにBを選択します(結局のところ、Bの値の比率が最大です)。2つの可能な組み合わせを定義します

  • 選択されたxxx B
  • 選択されたyyyはBを検索し、AAを選択しましたA

前者が優れている場合と後者が優れている場合を比較する方程式をリストできます

{時間:50 x = 500 + 50 y戦闘力:100 x = 200 y \ begin {cases}時間:50x = 500 + 50y \\戦闘力:100x = 200y \ end {cases} {{ とき部屋5 0 x=5 0 0+5 0 、Y戦争の戦闘1 0 0 x=2 0 0 、Y

取得することができます

{x = 20 y = 10 \ begin {cases} x = 20 \\ y = 10 \ end {cases} {{ バツ=2 0そして=1 0

言い換えれば、とき戦闘力を超えた2000 20002 0 0 0の場合、Cが使用され、それ以外の場合、Cは使用されません。

しかし、「タイタン」は1隻しか建造できません(一部の学生はこれに気づかなかったようです)

したがって、トピックはまだ比較的単純です

ACコード

void solve() {
    
    
    int n, ans = 0;
    cin >> n;
    if (n >= 2000) {
    
    
        ans += 500;
        n = (n + 1) / 2;
    }
    ans += n / 100 * 50 + (n % 100 >= 50 ? 50 : n % 100);
    cout << ans << endl;
}

ご飯を食べる立ち神

苦情を言う

この質問について何を言うべきですか?
背景コードを読んだ後
なぜ多くの人が99の長さの配列を開くのを好むのかわかりません...... 99
の値は小さすぎ
ます。配列を開くときにあまり怖がらないでください。直接限り、それがない以上億未満であると、数百万を開いて、問題は大きくはありません。
私たちの話題が明確に記述され、数字の数は2000 20002 0 0 0データ範囲は1e 9 − 2 e 9 1e9-2e91 e 92 e 9
なので、REがたくさんあります

この質問は、すべての質問の中で4番目に単純な質問です。

回答

この問題の最も簡単な解決策は、次のようにすべきだと思います

  • 各数値をループして、そこからaaを減算しますa
  • 別の長さは使用2000 2000をアレイ2 0 0 0は、タグ・アレイとして使用されます
  • 各値をタグ配列に入れ、タグ配列の対応する位置を「true」に変更します
  • 配列全体をトラバースして、「真」ではない唯一の配列を見つけて出力します

ACコード

void solve() {
    
    
    int n, a;
    cin >> n >> a;
    vector<bool> data(n + 1, false);
    for (int i = 0; i < n - 1; ++i) {
    
    
        int tmp;
        cin >> tmp;
        data[tmp - a] = true;
    }
    for (int i = 1; i <= n; ++i)
        if (!data[i]) {
    
    
            cout << i << endl;
            break;
        }
}

おすすめ

転載: blog.csdn.net/m0_43448982/article/details/111460449