标签:字典序 -- time 信息 lazy 收集 高度 注意 垂直
\(SERKOI\) 最新推出了一种叫做“免费馅饼”的游戏:
游戏开始后,从舞台天幕顶端的格子中不断出现馅饼并垂直下落。游戏者左右移动去接馅饼。游戏者每秒可以向左或向右移动一格或两格,也可以站在原地不动。
馅饼有很多种,游戏者事先根据自己的口味,对各种馅饼依次打了分。同时,在 \(8-308\) 电脑的遥控下,各种馅饼下落的速度也是不一样的,下落速度以格/秒为单位。
当馅饼在某一秒末恰好到达游戏者所在的格子中,游戏者就收集到了这块馅饼。
写一个程序,帮助我们的游戏者收集馅饼,使得所收集馅饼的分数之和最大。
Input
Output
Sample Input
3 3
0 1 2 5
0 2 1 3
1 2 1 3
1 3 1 4
Sample Output
12
-1
1
1
Hint
分析
Code
#include <bits/stdc++.h>
const int maxn=2500+5;
int w,h,n,Time;
int f[maxn][101];
int c[maxn],x[maxn],t[maxn],v[maxn];
void Read(){
scanf("%d%d",&w,&h);
h--;//馅饼就在最高一格出现
int T,X,V,C;
while(scanf("%d%d%d%d",&T,&X,&V,&C)==4){
if(h%V==0){//到达不了舞台的不用管
t[++n]=T+h/V;
x[n]=X;v[n]=V;c[n]=C;
Time=std::max(Time,t[n]);//记录最大的到达舞台的馅饼时间
}
}
memset(f,0,sizeof(f));
}
int mx(int i,int j){
int ans=0;
for(int k=-2;k<=2;++k){
if(j+k<0 || j+k>w)continue;
ans=std::max(ans,f[i+1][j+k]);
}
return ans;
}
void Solve(){
if(!n){//n==0说明没有一个能掉到舞台的
printf("0\n");return;
}
for(int i=1;i<=n;i++)//初始化
f[t[i]][x[i]]+=c[i];//有可能不同时刻的馅饼可能同时掉在舞台同一个位置
for(int i=Time-1;i>=0;i--)//从上往下好处理
for(int j=w;j>0;j--) //因为转移是有范围的
f[i][j]+=mx(i,j);
printf("%d\n",f[0][w/2+1]);
}
int main(){
Read();
Solve();
return 0;
}
标签:字典序 -- time 信息 lazy 收集 高度 注意 垂直
原文地址:https://www.cnblogs.com/hbhszxyb/p/13212758.html