noip2004普及组第2题 花生采摘
題目描述
魯賓遜先生有一只寵物猴,名叫多多。這天,他們兩個正沿著鄉(xiāng)間小路散步,突然發(fā)現(xiàn)路邊的告示牌上貼著一張小小的紙條:“歡迎免費品嘗我種的花生!――熊字”。
魯賓遜先生和多多都很開心,因為花生正是他們的最愛。在告示牌背后,路邊真的有一塊花生田,花生植株整齊地排列成矩形網(wǎng)格(如圖11)。有經(jīng)驗的多多一眼就能看出,每棵花生植株下的花生有多少。為了訓練多多的算術(shù),魯賓遜先生說:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此類推,不過你一定要在我限定的時間內(nèi)回到路邊。”
我們假定多多在每個單位時間內(nèi),可以做下列四件事情中的一件:
1) 從路邊跳到最靠近路邊(即第一行)的某棵花生植株;
2) 從一棵植株跳到前后左右與之相鄰的另一棵植株;
3) 采摘一棵植株下的花生;
4) 從最靠近路邊(即第一行)的某棵花生植株跳回路邊。
現(xiàn)在給定一塊花生田的大小和花生的分布,請問在限定時間內(nèi),多多最多可以采到多少個花生?注意可能只有部分植株下面長有花生,假設這些植株下的花生個數(shù)各不相同。
例如在圖2所示的花生田里,只有位于(2, 5), (3, 7), (4, 2), (5, 4)(2,5),(3,7),(4,2),(5,4)的植株下長有花生,個數(shù)分別為13, 7, 15, 913,7,15,9。沿著圖示的路線,多多在2121個單位時間內(nèi),最多可以采到3737個花生。
輸入輸出格式
輸入格式:
第一行包括三個整數(shù),M, N和K,用空格隔開;表示花生田的大小為M \times N(1 \le M, N \le 20)M×N(1≤M,N≤20),多多采花生的限定時間為K(0 \le K \le 1000)K(0≤K≤1000)個單位時間。接下來的MM行,每行包括N個非負整數(shù),也用空格隔開;第i + 1行的第j個整數(shù)P_{ij}(0 \le P_{ij} \le 500)P
ij
? (0≤P
ij
? ≤500)表示花生田里植株(i, j)(i,j)下花生的數(shù)目,00表示該植株下沒有花生。
輸出格式:
一個整數(shù),即在限定時間內(nèi),多多最多可以采到花生的個數(shù)。
輸入輸出樣例
輸入樣例#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
說明
noip2004普及組第2題
題目本身并不是很難。主要是要看到題目規(guī)定的并不是要采的最多,必須從大到小,依次采摘,因此我們只貪心就可以,用結(jié)構(gòu)體存下橫縱坐標和數(shù)量,然后排序,按照排序后的順序依次采摘,期間計算耗費的時間,每計算一個就要進行判斷當前所剩余的時間是否可以回去,當不能回去時則到達上一個點時的采摘量,就是最多的采摘量。(注意計算時的橫縱坐標,是根據(jù)x算還是y,這個根據(jù)自己存儲的不同使用的也不同,我在這里傻乎乎的找了好長時間orz)
代碼
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int pic[50][50]; int ans,n,m,k,cnt,nowx,nowy,tot; struct edge{int x,y,v; }e[5000]; bool cmp(edge a,edge b){return a.v > b.v; } int main(){scanf("%d%d%d",&n,&m,&k);for(int i = 1; i<=n; i++){for(int j = 1; j<=m; j++){scanf("%d",&pic[i][j]);if(pic[i][j]){cnt ++;e[cnt].x = i;e[cnt].y =j;e[cnt].v = pic[i][j];}}} sort(e+1,e+1+cnt,cmp); if(2*e[1].y + 1 > k){cout << 0;return 0;}else if(2*e[1].x + 1 == k){cout << e[1].v;return 0;}nowy = e[1].y;for(int i = 1; i<=cnt; i++){tot += abs(nowy - e[i].y) + abs(nowx - e[i].x) + 1; if(tot + e[i].x > k)break;nowx = e[i].x;nowy = e[i].y;ans += e[i].v; }cout << ans ;return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/Euplectella/p/10092821.html
總結(jié)
以上是生活随笔為你收集整理的noip2004普及组第2题 花生采摘的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转】在树莓派上实现人脸识别
- 下一篇: /usr/bin/python^M: 解