羅区P1281の本問題への解決策をコピーします

本のP1281コピー

トピックの背景

ほとんどの人が間違った理由:可能な限りコピーが少ない人の前では、最初の少数の人々は、対応する出力に00人を書きません書くことができない場合。

しかし、データは、誰もが乾燥することができ生きるために持っていることを確認するように変更されました。

タイトル説明

今、私たちはこの本をMとコピーされた2つ(またはそれ以上)の人に本を許可していませんkは、レプリケーションを与えるため(コピー)、みんなのコピー速度は、同じを与えてきた、すべての人に配布この本は、それは例えば、同じ人物を転写する第1、第3、第4の本を取ることができない、連続していなければなりません。

今、あなたは、最短時間をコピーしたプログラムを設計します。ほとんどの人は、時間のコピーページを費やした時間をコピーします。

入力形式

(k≤m≤500); 2整数m、kの最初の行

第二ラインmの整数、iは本のページの数を示す整数I。

出力フォーマット

二つの整数のk行の合計は、開始番号がi行ブックのi番目の個別の転写終結番号を示します。複数の解決策がある場合は数kラインを起動すると、その後、可能な限りコピーが少ない人の前で、昇順にする必要があります。

サンプル入力と出力

入力#1

9 3
1 2 3 4 5 6 7 8 9

出力#1

1 5
6 7
8 9

[思考]

二値の答え

[Tucao]

二値解答テンプレートのタイトル
が、彼の出力は非常に病気の人である
バックはできるだけ多くの人がよくコピーできるようにするので
、バックから列挙する必要がある
コピーの背後にあるとして多くの人々をさせるために
、それは1-出力されたとき範囲がコピーされた本の中で、エンド皆におけるk順次出力
とても迷惑

[コア]アイデア

ほとんどの人々を得るにコピーされたページ数が最小のコピー
最大最小の
答えの利用半分がいることを非常に明確であるなぜ
コピー数の最も人半コピー
列挙から前方に移動し、その後
の満足コピーではありません何をチェック個人的なコピー半分またはアウト以下はページの最大数のこの場合は
以下のk個人用コピー仕上げかもしれ
それがtrueを返した場合
、逆虚偽を
使用すると、簡単に2箇所で見ることができるように

[完了コード】

#include<iostream>
#include<cstdio>

using namespace std;
const int Max = 505;
int a[Max];
int xx[Max],yy[Max];
int k,m;
bool check(int x)
{
    int tot = 0;
    int js = 0;
    for(register int i = m;i >= 1;i --)
    {
        if(a[i] > x)
            return false;
        tot += a[i];
        if(tot > x)
        {
            if(js == k - 1)
                return false;
            else
                tot = a[i],js ++;
        }
        if(js == k && i != 1)
            return false;
    }
    return true;
}

int main()
{
    int tot = 0;
    cin >> m >> k;
    for(register int i = 1;i <= m;++ i)
        cin >> a[i],tot += a[i];
    int l = 0,r = tot;
    while(l < r)
    {
        int mid = (r + l) >> 1;
        if(check(mid))
            r = mid;
        else
            l = mid + 1;
    }
    yy[k] = m;
    int sum = k;
    int ans = 0;
    a[0] = 9999999;
    for(register int i = m;i >= 0;i --)
    {
        ans += a[i];
        if(ans > l)
        {
            ans = a[i];
            xx[k] = i + 1;
            k --;
            yy[k] = i;
        }
    }
    for(register int i = 1;i <= sum;++ i)
        cout << xx[i] << " " << yy[i] << endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/acioi/p/11706685.html