問題への羅区P1086ピーナッツピッキングソリューション

P1086は、ピーナッツを選びます

タイトル説明

氏ロビンソンは多くのことを名前のペットの猿を持っています。その日、突然、国の道路に沿って歩いている二人は、道端の看板に貼り付けられた紙の小片が見つかりました:「私は自由に試飲ピーナッツ種を歓迎 - 単語を負い!」

氏ロビンソンと非常に満足の多くは、ピーナッツが自分の好きなので。符号の後ろに、路側は本当にきちんと長方形の格子状に配置されたピーナッツフィールドピーナッツ植物(図11)を有します。経験豊富な一見の多くは、それらのそれぞれどのくらいのピーナッツ植物でピーナッツがあります。ようにと、ほとんどのピーナッツは、ピーナッツがそれを選ぶためにどこその後、植物の残りの部分を見つけ、あなたが最初にピーナッツを選択する最大のピーナッツ植物を見つける」:算術演算の多くを訓練するためには、氏ロビンソンは言いましたしかし、あなたは私の限られた時間の中で道路の側に戻って行かなければなりません。」

私たちは、時間の各ユニットでの多くは、あなたが1で、次の4つのことを行うことができますことを前提としています。

  1.  从路边跳到最靠近路边(即第一行)的某棵花生植株;
    
  2.  从一棵植株跳到前后左右与之相邻的另一棵植株;
    
  3.  采摘一棵植株下的花生;
    
  4.  从最靠近路边(即第一行)的某棵花生植株跳回路边。
    

今ピーナッツとピーナッツフィールドの大きさの分布を与え、どのように多くのピーナッツの多くを拾うために、限られた時間のために頼みますか?ピーナッツ植物の唯一のいくつかは、これらの異なるにおけるピーナッツ植物の数を想定し、以下育つことに注意してください。

例えば、落花生フィールドは、図2に示す、のみ(2,5)、(3,7)、(4,2)、(5,4)ピーナッツ植物が成長の、それぞれ13の数、7位置、15、9。ルートに沿って示され、時間の21単位のロットでは、37のピーナッツまで取ることができます。

入力形式

最初の行は三つの整数、含ま\(M \) \(N \)\(K \)スペースによって分離し、;このフィールドは、ピーナッツの大きさを示している(M \回N(1 \を \ルM、N \ 20 \))ルで、多くの時間は、ピーナッツ鉱山として定義されている\(K(0 \ルK \ル1000)\) 時間の単位。\(M \)行、また、スペースで区切られた非負整数NNを含む各行;セクション\(I + 1 \)のライン上の\(J \)整数\(P_ {IJ}( 0 \ルP_ {IJ} \ル500)\) ピーナッツ植物のフィールドを表す)\)\((I、 Jのピーナッツの数は、ピーナッツ0は、このない植物がないことを示します。

出力フォーマット

限られた時間内で整数、すなわち、ピーナッツのロット番号をピックアップします。

サンプル入力と出力

入力#1

6 7 21
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

出力#1

37

入力#2

6 7 20
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

出力#2

28

説明/ヒント

グループ2タイトルのnoip2004人気

[思考]

使用時:40分
検索+アナログは、
ピーナッツの物語を選びます。
この質問は、私は、トピックの重要性を理解ので、読んだ後に行われます!

まず、入力データ、位置や数ではありません0ピーナッツと構造まで保存
終了命じたピーナッツの数に応じて構造を入力
シーケンスのうちショットされたタスクシーケンスを

その後、プロセス、シミュレートするには、この順に見て
、各二次ミッションの目的は、列挙に到達するため
、到達するのに十分残っているKを見て選ぶと戻って
それを配置するのに十分な時間でない場合は
撮影されている良いと直接はピーナッツ休暇
ので、戻って行くことができない、あまりにも判断されたポイントに到達する前に
十分なポイントを使用する前に、その時間を心配していない
バックアップできる上に直接に

残り時間が十分である場合、
その点に達し、プラスANSのピーナッツの数
Kピーナッツを選ぶために必要な時間の到着時刻を減算することにより、必要と
し、次の点が実施されます

最初の点は、最初の行に最も近い場所から直接アクセスされるので、
点x、このために必要な時間である
が、到着の他の点からの点の前にxとyとxとyとの差の絶対値である
2種は異なるされている
ので、最初の時点で別々に処理すること、または構造でカンニングする
コメント内のコードでアウトこの小さな手と足の

[完了コード】

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>

using namespace std;
const int Max = 25;

int f[Max][Max];
struct node
{
    int x,y,z;
}a[Max * Max];
int sum = 0;

bool cmp(const node x,const node y)
{
    return x.z > y.z;
}

int main()
{
    int m,n,k;
    scanf("%d%d%d",&m,&n,&k);
    for(int i = 1;i <= m;++ i)
        for(int j = 1;j <= n;++ j)
        {
            scanf("%d",&f[i][j]);
            if(f[i][j] != 0)
            {
                a[++ sum].x = i;
                a[sum].y = j;
                a[sum].z = f[i][j];
            }
        }
    sort(a + 1,a + sum + 1,cmp);
    int ans = 0;
    a[0].y = a[1].y;//小手脚
    //将1的前一个0 的y变为和1的y一样,那这样减去之后就会等于0了,就不会影响了 
    for(int i = 1;i <= sum;++ i)
    {
        if( abs(a[i].x - a[i - 1].x) + abs(a[i].y - a[i - 1].y) + 1 + a[i].x <= k)
        {
            k -= abs(a[i].x - a[i - 1].x) + abs(a[i].y - a[i - 1].y) + 1;
            ans += f[a[i].x][a[i].y];
        }
        else
        {
            cout << ans << endl;
            return 0;
        }
    }
    cout << ans << endl;
    return 0;
}

おすすめ

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