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;
}