5061 天上掉馅饼经验值:0
题目描述 Description
都说天上不会掉馅饼,但有一天酷町猫正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来酷町猫的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以酷町猫马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于酷町猫平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标上坐标:
为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。开始时酷町猫站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中其中一个位置上的馅饼。问酷町猫最多可能接到多少个馅饼?(假设他的背包可以容纳无穷多个馅饼)
输入描述 Input Description
输入数据有多组。每组数据的第一行为一正整数n(0<n<100000),表示有n个馅饼掉在这条小径上。在结下来的n行中,每行有两个整数x,T(0<T<100000),表示在第T秒有一个馅饼掉在x点上。同一秒钟在同一点上可能掉下多个馅饼。n=0时输入结束。
输出描述 Output Description
每一组输入数据对应一行输出。输出一个整数m,表示gameboy最多可能接到m个馅饼。
样例输入 Sample Input
6 5 1 4 1 6 1 7 2 7 2 8 3 0
样例输出 Sample Output
4
疯狂debug*2个小时,80分泪目,望大佬指教
#include<iostream>
#include<cstring>
using namespace std;
int n,a[100005][15]/*前面是时间,后面是距离*/,f[100005][15],t,x,mx;
int main(){
while(1){
cin>>n;
if(n==0)break;
for(int i=1;i<=n;i++){
cin>>x>>t;
a[t][x]++;
}
for(int i=4;i<=6;i++){
f[1][i]=a[1][i];
}
for(int i=2;i<=100000;i++){
for(int j=0;j<=10;j++){
if(!(i+j<=3||j-i>=7)){
if(j==0){
f[i][j]=max(f[i-1][j],f[i-1][j+1])+a[i][j];
}
else if(j==10){
f[i][j]=max(f[i-1][j-1],f[i-1][j])+a[i][j];
}
else f[i][j]=max(max(f[i-1][j-1],f[i-1][j]),f[i-1][j+1])+a[i][j];
}
else f[i][j]=0;
}
}
mx=-0x3f3f3f3f;
for(int i=0;i<=10;i++){
mx=max(f[100000][i],mx);
}
cout<<mx<<endl;
memset(a,0,sizeof(a));
memset(f,0,sizeof(f));
}
return 0;
}
我已经要崩溃了,愿好心人拯救我!
吕若朴在2020-08-07 18:15:11追加了内容
贴沉大海
吕若朴在2020-08-08 10:07:41追加了内容
这题自行AC了,豆子随便送人
你的帖沉进了大海
而我的帖就是大海
所以你的帖是攻我的帖是受(狗头保命)
这道题你的做法是贪心
想AC肯定是要正版背包的
添加一个回溯算法
当得出此种方法最多能接的馅饼数时
回溯
这算法时间较长,可能WC
……
每次找出最多能接的馅饼