问题标题: 酷町堂:我崩溃了,5061干的

0
1
已解决
吕若朴
吕若朴
中级光能
中级光能

5061   天上掉馅饼经验值:0

题目描述 Description

都说天上不会掉馅饼,但有一天酷町猫正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来酷町猫的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以酷町猫马上卸下身上的背包去接。但由于小径两侧都不能站人,所以他只能在小径上接。由于酷町猫平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。现在给这条小径如图标上坐标:
image.png

为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在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了,豆子随便送人


0
已采纳
宣海宁
宣海宁
中级光能
中级光能

dalao,能发点人看得懂的东西吗

0
0
0
0
0
0
刘英杰
刘英杰
新手天翼
新手天翼

你的帖沉进了大海

而我的帖就是大海

所以你的帖是攻我的帖是受(狗头保命)

这道题你的做法是贪心

想AC肯定是要正版背包的

添加一个回溯算法

当得出此种方法最多能接的馅饼数时

回溯

这算法时间较长,可能WC

……

每次找出最多能接的馅饼

0
黄子扬
黄子扬
初级天翼
初级天翼

两个方向dfs(本人思路)

当然dp也可以

debug在哪?

我要回答