天天看點

noip2004 花生采摘 (枚舉)

A1148. 花生采摘

1.0s   記憶體限制:

256.0MB  

​​321​​   AC次數:

102   平均分:

57.04

将本題分享到:

​​檢視未格式化的試題​​​   

​​​送出​​​   

​​​試題讨論​​

試題來源

  NOIP2004 普及組

問題描述

  魯賓遜先生有一隻寵物猴,名叫多多。這天,他們兩個正沿着鄉間小路散步,突然發現路邊的告示牌上貼着一張小小的紙條:“歡迎免費品嘗我種的花生! ——熊字”。

  魯賓遜先生和多多都很開心,因為花生正是他們的最愛。在告示牌背後,路邊真的有一塊花生田,花生植株整齊地排列成矩形網格(如圖 1)。有經驗的多多一眼就能看出,每棵花生植株下的花生有多少。為了訓練多多的算術,魯賓遜先生說:“你先找出花生最多的植株,去采摘它的花生;然後再找 出剩下的植株裡花生最多的,去采摘它的花生;依此類推,不過你一定要在我限定的時間内回到路邊。”

  我們假定多多在每個機關時間内,可以做下 列四件事情中的一件:

  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行,每行包括N個非負整數,也用空格隔開;第i + 1行的第j個整數Pij(0 <= Pij <= 500)表示花生田裡植株(i, j)下花生的數目,0表示該植株下沒有花生。

輸出格式

  輸出檔案包括一行,這一行隻包含一個整數,即在限定時間内,多多最多可以采到花生的個數。

樣例輸入

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

樣例輸出

37

樣例輸入

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

樣例輸出

28

資料規模和約定

解析:提上已經說了,每個點的花生數量都不一樣,那麼就可以直接将每個有花生的點按照花生數量進行排序。然後 按照花生數量從大到小進行枚舉,對于 i 号點的花生,若多多采了這個花生後還能回到路邊,那麼采之;否則就結束枚舉。

代碼:

#include<cstdio>
#include<algorithm>
#define maxn 20
using namespace std;
struct tnode{int x,y,s;}a[maxn*maxn+50];
int m,n,t;

bool cmp(tnode a,tnode b)
{
  return a.s>b.s;
} 

int main()
{
  int i,j,k=0,x,y,z;
  scanf("%d%d%d",&m,&n,&t);
  for(i=1;i<=m;i++)
    for(j=1;j<=n;j++)
      {
        scanf("%d",&a[k].s);
        if(a[k].s!=0)a[k].x=i,a[k].y=j,k++;
      }
  sort(a,a+k,cmp);
  
  if(a[0].x*2+1>t){printf("0\n");return;}
  x=a[0].x+1,y=a[0].s;
  for(i=1;i<k;i++)
    {
      z=abs(a[i].x-a[i-1].x)+abs(a[i].y-a[i-1].y);
      if(x+z+1+a[i].x<=t)x+=(z+1),y+=a[i].s;
      else 
        {
          x+=a[i-1].x;
          break;
        }
    }
  printf("%d\n",y);
  return 0;
}