CSDN プログラミング コンテスト 40 の質問

大会概要

CSDN プログラミング コンテスト Forty:コンテストの詳細 (csdn.net)

競争ソリューション

トピック 1. 小魚の航海

午前中に150キロ、午後に100キロ泳ぎ、夜と週末に休む小魚がいる(土日実施)。週 x (1<=x<=7) から始まると仮定すると、魚は n 日後に合計何キロ泳ぎましたか?

#include <cstdio>

int main () {
    long long int result = 0;
    long long int x, n;
    scanf ("%lld %lld", &x, &n);
    while (n --> 0) {
        if (x >= 7) {
            x = 1;
        } else if (x >= 6) {
            x += 1;
        } else {
            x += 1;
            result += 250;
        }
    }
    return 0;
}

この問題は、ダイレクト シミュレーションによって解決できます。データ範囲が大きいため、ブルート フォース シミュレーションはタイムアウトになり、ループの前に最適化する必要があることに注意してください。

この小さな魚は週に 5 日働き、週に 1,250 キロ泳ぐことができます。残りの日数を 7 の残りに変更し、ループ時に端数のみを計算します。

トピック 2、コーディング

エンコーディングは、暗号文または圧縮された伝送に適用されることがよくあります。ここでは、エンコードに最も単純なエンコード方法の 1 つを使用します。通常の単語を数値にエンコードします。アルファベットには {a、b、...、z} の 26 文字があり、これらの特殊な単語の長さは 6 文字以内で、文字は昇順に並べられています。このような同じ長さの単語をすべてまとめて辞書順に並べると、単語のエンコーディングはシーケンス全体での位置に対応します。あなたの仕事は、与えられた単語のコードを見つけることです。

この質問は、第 14 回大会で遭遇したもので、Luogu の元の質問です。

トピック 3. 1 次元配列の部分配列の最大和

整数配列 nums を指定して、合計が最大になる連続部分配列を見つけ、元の配列内の部分配列の開始添字と終了添字を出力します。元の配列添字は 0 から始まります。

第21回のコンテストは1回出て、問題は部分配列の最大和の値で、今回は開始添字と終了添字になりました。しかし、核となる考え方は以前と同じで、次のブロガーが詳しく説明します。

前置合計アルゴリズムを使用して、データの各項目の前置合計を計算します。Sentinels を使用して、これを適切に処理できます。

データの最初の項目はゼロに設定され、データは後ろから読み込まれます。前置合計を計算する場合、2 番目の項目の前置合計は最初の 2 つの項目の合計であり、3 番目の項目の前置合計は最初の 3 つの項目の合計であり、以下同様です (前置合計の実際の値は2 番目の項目は 0+ 最初の項目のデータです)。そうすることで、初期化の方法を簡略化できるだけでなく、起点添え字の計算方法を最適化することができる。

使用時には、データの 1 番目から 5 番目までの累積和を求める必要があると仮定すると、前置和 [6] から前置和 [1] を引くだけで済みます。このとき、センチネル位置の導入により、起点添字は計算で使用する接頭辞と添字に対応し、1 をそのまま使用することができます。終点添え字の目標値は 5 ですが、実際には 6 番目の項目の前置和が計算に使用されるため、終点添え字を減算する必要があります。センチネルが導入されていない場合は、終了添字を直接使用できますが、開始添字には追加の判断が必要です (たとえば、1 番目から 5 番目のデータの累積和を求める場合、前置和 [5] を使用してデータを減算する場合)。 prefix sum [1] の場合、2 番目から 5 番目までのデータの累計しか取得できず、1 番目の項目のデータを補完する必要があります)。セントリーポジションの導入により運用の利便性が大幅に向上し、コストパフォーマンスが非常に高いことがわかります。

貪欲なアルゴリズムは、累積と最大間隔を求めるときに組み合わせることができます。たとえば、最初の項目と 5 番目の項目の間のデータの累積合計が 0 未満の場合、データの 6 番目の項目の位置は、次の累積合計を使用せずに、新しい間隔の開始点として直接使用できます。 1 番目の項目と 5 番目の項目の間のデータ 6 番目の項目を追加すると、合計結果がどんどん小さくなります。逆に、間隔の累積合計がゼロより大きい場合、次の項目が発生したときに、次の項目の値を前の累積合計に追加するだけで、貪欲の考えが反映されます。

トピック 4. 水好きのカエル

いつも水遊びが好きなカエルは、ある日川を渡って友達を訪ねます。川にはトゲのある未知の生き物がたくさんいることが知られており、通過する唯一の道は長さLの直線です。直線上にm個の石がランダムに分布しています。カエルの最小跳躍距離は s、最大跳躍距離は t です。カエルはできるだけ石を踏まないようにしたいのですが、川を渡るとき、少なくとも何個の石を踏むことになるでしょうか。

NOIPオリジナルタイトル。NOIPコンペで規定されているテストデータの範囲の中で、この問題の長さLパラメータの範囲は特に大きいです。したがって、状態の圧縮は、必要な状態のみを保持するために必要です。そうしないと、タイムアウトになり、テスト ポイントの一部しか通過できなくなります。NOIP問題解のネットワークディスク資源の集合を探すために、NOIP系列の問題の解法を学ぶことができます。

おすすめ

転載: blog.csdn.net/x1051496412/article/details/129788286