免费馅饼游戏
SERKOI最新推出了一种叫做“免费馅饼”的游戏。
游戏在一个舞台上进行。舞台的宽度为W格,天幕的高度为H格,游戏者占一格。开始时游戏者站在舞台的正中央,手里拿着一个托盘。下图为天幕的高度为4格时某一个时刻游戏者接馅饼的情景。
当馅饼在某一秒末恰好到达游戏者所在的格子中,游戏者就收集到了这块馅饼。
写一个程序,帮助我们的游戏者收集馅饼,使得所收集馅饼的分数之和最大。
输入
输入文件的第一行是用空格隔开的两个正整数,分别给出了舞台的宽度W(1到99之间的奇数)和高度H(1到100之间的整数)。
接下来依馅饼的初始下落时间顺序给出了所有馅饼的信息。每一行给出了一块馅饼的信息。由四个正整数组成,分别表示了馅饼的初始下落时刻(0到1000秒),水平位置、下落速度(1到100)以及分值。游戏开始时刻为0。从1开始自左向右依次对水平方向的每格编号。
输入文件中同一行相邻两项之间用一个或多个空格隔开。
输出
输出文件的第一行给出了一个正整数,表示你的程序所收集的最大分数之和。
其后的每一行依时间顺序给出了游戏者每秒的决策。输出0表示原地不动、1或2表示向右移动一步或两步、-1 或-2表示向左移动一步或两步。输出应持续到游戏者收集完他要收集的最后一块馅饼为止。
样例输入
1 2 3 4 5 6 7 8 9 |
3 3 0 1 2 5 0 2 1 3 1 2 1 3 1 3 1 4 |
样例输出
1 2 3 4 5 6 7 |
12 -1 1 1 |
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
#include <iostream> #include <cstring> using namespace std; int step; int f[1200][101]; int mx(int i,int j) { int m=0; if(f[i+1][j-2]>m&&j-2>0){m=f[i+1][j-2];step=-2;} if(f[i+1][j-1]>m&&j-1>0){m=f[i+1][j-1];step=-1;} if(f[i+1][j]>m){m=f[i+1][j];step=0;} if(f[i+1][j+1]>m){m=f[i+1][j+1];step=1;} if(f[i+1][j+2]>m){m=f[i+1][j+2];step=2;} return m; } int main() { int c[10001],x[10001],t[10001],v[10001]; int n=1,h,w; int i,j,k; int m=0,time=0; cin>>w>>h; h--; while(cin>>t[n]>>x[n]>>v[n]>>c[n]){ if(h%v[n]==0){ t[n]+=h/v[n]; time=max(time,t[n]); n++; } } memset(f,0,sizeof(f)); for(i=1;i<=n;i++)f[t[i]][x[i]]+=c[i]; for(i=time-1;i>=0;i--) for(j=w;j>0;j--) f[i][j]+=mx(i,j); cout<<f[0][w/2+1]<<endl; for(i=0,j=w/2+1;;i++){ if(mx(i,j)==0)break; j+=step; cout<<step<<endl; } return 0; } |
Subscribe