纪中模拟赛——接苹果
生活随笔
收集整理的這篇文章主要介紹了
纪中模拟赛——接苹果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:
很少有人知道奶牛愛吃蘋果。農夫約翰的農場上有兩棵蘋果樹(編號為1和2),每一棵樹上都長滿了蘋果。奶牛貝茜無法摘下樹上的蘋果,所以她只能等待蘋果從樹上落下。但是,由于蘋果掉到地上會摔爛,貝茜必須在半空中接住蘋果(沒有人愛吃摔爛的蘋果)。貝茜吃東西很快,所以她接到蘋果后僅用幾秒鐘就能吃完。? 每一分鐘,兩棵蘋果樹其中的一棵會掉落一個蘋果。貝茜已經過了足夠的訓練,只要站在樹下就一定能接住這棵樹上掉落的蘋果。同時,貝茜能夠在兩棵樹之間快速移動(移動時間遠少于1分鐘),因此當蘋果掉落時,她必定站在兩棵樹其中的一棵下面。此外,奶牛不愿意不停地往返于兩棵樹之間,因此會錯過一些蘋果。
? 蘋果每分鐘掉落一個,共T(1<=T<=1000)分鐘,貝茜最多愿意移動W(1<=W<=30)次。現給出每分鐘掉落蘋果的樹的編號,要求判定貝茜能夠接住的最多蘋果數。開始時貝茜在1號樹下。
輸入
第1行:由空格隔開的兩個整數:T和W
第2..T+1行:1或2(每分鐘掉落蘋果的樹的編號)
輸出
第一行:在貝茜移動次數不超過W的前提下她能接到的最多蘋果數樣例輸入
7 2
2
1
1
2
2
1
1
樣例輸出
6
數據范圍限制
如題
提示
【樣例說明】
7分鐘內共掉落7個蘋果——第1個從第2棵樹上掉落,接下來的2個蘋果從第1棵樹上掉落,再接下來的2個從第2棵樹上掉落,最后2個從第1棵樹上掉落。貝茜不移動直到接到從第1棵樹上掉落的兩個蘋果,然后移動到第2棵樹下,直到接到從第2棵樹上掉落的兩個蘋果,最后移動到第1棵樹下,接住最后兩個從第1棵樹上掉落的蘋果。這樣貝茜共接住6個蘋果。解題思路:
這是一篇遲到的博客——來自ssl_wyc
好了,是時候進入正題了——一道dp題,轉移方程是:
x=(j%2==c[i]-1?1:0); y=max(f[i-1][j-1],f[i-1][j]); f[i][j]=x+y;
i=1..t j=1..w
f[i][0]每一次都要判斷是否為第一棵樹,true則+1否則不變
然后一個循環0..w找最大
源程序:
#include <cstdio> using namespace std; int t,w,f[1001][31],c[1001],n,maxn; int max(int x,int y){return x>y?x:y; } int main() {//freopen("bcatch.in","r",stdin);//freopen("bcatch.out","w",stdout);scanf("%d%d",&t,&w);for(int i=1;i<=t;i++)scanf("%d",&c[i]);for(int i=1;i<=w;i++)f[0][i]=0;for(int i=1;i<=t;i++)//f數組為i分鐘時走j步最大吃蘋果的數量{f[i][0]=f[i-1][0]+c[i]%2;for(int j=1;j<=w;j++){int x=j%2==c[i]-1;//如果當前所在樹有蘋果掉落,x就為1,否則就為0int y=max(f[i-1][j-1],f[i-1][j]);//只能選擇走一步或者不走,所以只在上一分鐘走與不走找最大f[i][j]=x+y;//你懂得}}for(int i=0;i<=w;i++)if (f[t][i]>maxn) maxn=f[t][i];//找最大printf("%d",maxn);//愉快地輸出最大值return 0; }轉載于:https://www.cnblogs.com/Juruo-HJQ/p/9306937.html
總結
以上是生活随笔為你收集整理的纪中模拟赛——接苹果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 形似棺材的“抗震救生床”,你会要吗?
- 下一篇: SpringMVC日期类型转换问题三大处