1044火星ショッピング(25点(S)) - C言語PATグレード

免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/huaxuewan/article/details/102408826

火星に1044ショッピング(25点(S))

火星でのショッピングは全く異なる経験です。火星人は連鎖ダイヤモンドで支払います。各ダイヤモンドは(火星ドルM $で)値を持ちます。支払いを行うときに、チェーンは一度だけのための任意の位置で切断することができ、ダイヤモンドのいくつかは、チェーン1ずつ取り出されます。ダイヤモンドはチェーンオフになると、それが戻って撮影することはできません。我々は値M $ 3,2、1、5、4、6、8、7と8つのダイヤモンドの鎖を有しており、たとえば、我々は、M $ 15が支払わなければなりません。我々は3つのオプションを持っていることがあります。

  1. 4と6の間の鎖を切断し、(値3 + 2 + 1 + 5 + 4 = 15で)位置1から5にダイヤモンドを取ります。
  2. 5前または6の後に切断し、6(5 + 4 + 6 = 15の値を有する)に位置4からダイヤモンドを取ります。
  3. 8前に切断し、(値8 + 7 = 15で)位置7から8にダイヤモンドを取ります。

今、ダイヤモンドの値と、顧客が支払わなければならない量の連鎖を与え、あなたは顧客のためにすべての有料オプションを一覧表示することになっています。
それは正確な金額を支払うことが不可能である場合は、失われた最小と解決策を提案しなければなりません。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。N(≤10:それぞれの場合のために、最初の行は、2つの数字含ま5)、総鎖上のダイヤモンドの数、およびM(≤10 8)、顧客が支払わなければならないこと量。その後、次の行は、N正数D含ま1 ⋯D N(D iは、 ≦10 3ダイヤモンドの値であり、i = 1からすべてのために、⋯、N)を。行のすべての数字は、スペースで区切られます。

出力仕様:

各テストケースのために、私の各ペアのためのラインの印刷ijはjは≤ようにD I + ... + D J = M.複数のソリューションがある場合、すべての溶液は、iの昇順に印刷する必要があります。
私のペアのための溶液、出力ijが存在しない場合は、Jを≤ようにD I + ... + D J >とM(D I + ... + D J - M)が最小。再び、すべてのソリューションは、iの昇順で印刷しなければなりません。
ダイヤモンドの合計値が与えられた金額を支払うために十分であることが保証されています。

サンプル入力1:

15 16
3 2 1 5 4 6 8 7 16 10 15 11 9 12 14 13

サンプル出力1:

1-5
4-6
7-8
11-11

サンプル入力2:

5 13
2 4 5 7 9

サンプル出力2:

2-4
4-5

効果の件名:

配列が正確に等しい場合シーケンスの最小コストを見つけるために、見つけることができないN個の入力素子の配列、及び所望Mに正確に等しい連続したシーケンスの要件は、(シーケンス値がより大きいかまたはMに等しくなければなりません)。

すべての可能な結果の出力、各シーケンスの前と後のインデックス。

デザインのアイデア:
  • メンテナンスウィンドウは、最初から最後まで、ウィンドウ、および最小所望値maxを維持するコストを横切ります
    • もし(合計<M)、右ウィンドウの右側
    • それ以外の場合(合計> = M)、右に左の窓
      • (合計<MAX)、すなわち、必要な最小値は、メンテナンスコストを変更する場合は、再録音した結果を、この時点で必要
      • (合計== M)であれば、現在の最低価格の期待に沿って、結果を記録
  • ウィンドウがまだ決定されて移動する必要が、配列の終わりに達するので、元の配列の右側は0のセンチネル値に加算することができます
    • 図9に示すように、例えば、Mの値は、三つの要素の配列、プラスセンチネル0
    • 1、3、9、0、9はその端部に達した後、必要が左分析を移動し続けます
    • 1、3、5、0、5はその端部に達した後、右判断が依然としてループを入力することができ
コンパイラ:C(GCC)
#include <stdio.h>
#include <limits.h>

int main(void)
{
        int n, m, d[100001] = {0};
        int p[100000] = {0}, q[100000] = {0}, count = 0, max = INT_MAX;
        int sum = 0;
        int i, j;

        scanf("%d %d", &n, &m);
        for (i = 0; i < n; i++) {
                scanf("%d", &d[i]);
        }

        i = 0; j = 0;
        while (i < n && j <= n) {
                if (sum < m) {
                        sum += d[j];
                        j++;
                } else {
                        if (sum < max) {
                                max = sum;
                                count = 0;
                                p[count] = i + 1;
                                q[count] = j;
                                count++;
                        } else if (sum == max) {
                                p[count] = i + 1;
                                q[count] = j;
                                count++;
                        }
                        sum -= d[i];
                        i++;
                }
        }

        for (i = 0; i < count; i++) {
                printf("%d-%d\n", p[i], q[i]);
        }
        return 0;
}

おすすめ

転載: blog.csdn.net/huaxuewan/article/details/102408826