急!!!暴0求调全WA(非洛谷原题)【蓝桥杯改编】 求调
  • 板块学术版
  • 楼主your_god_is_me
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/21 11:26
  • 上次更新2025/1/21 14:36:13
查看原帖
急!!!暴0求调全WA(非洛谷原题)【蓝桥杯改编】 求调
1035324
your_god_is_me楼主2025/1/21 11:26
时间限制:1.0s   内存限制:256.0MB   Special Judge   代码提交间隔:5分钟(现在可以提交)  
问题描述
  有一条长为n的走廊,小明站在走廊的一端(两端不在走廊上),每次可以跳过不超过p格,每格都有一个正权值wi。
  小明要从一端跳到另一端,不能回跳,请问他跳过的方格的权值和最小是多少?具体的方案是什么?
输入格式
  输入的第一行包含两个整数n, p,表示走廊的长度和小明每次跳跃的最长距离。
  接下来n个整数,表示走廊每个位置的权值。
输出格式
  第一行输出一个整数。表示小明跳过的方格的权值和的最小值。
  第二行一个整数,表示小明在走廊上走过的格数。
  第三行若干个整数,从小到大表示小明走过的位置。如果有多种方案,输出任意一种。
样例输入   
11 3
8 2 3 6 4 9 7 1 10 5 2
样例输出   
9
4
2 5 8 11
数据规模和约定
  1<=n, p<=1000, 1<=wi<=1000。

我的代码:

#include <bits/stdc++.h>
using namespace std;

long long a[1010] , dp[100010] , op[1010];

string ans[10100] ;

string to(int x)
{
	string g ; 
	int t = 0 ;
	while(x)
	{
		t = t * 10 + x % 10 ;
		x /= 10; 
	}
	while(t)
	{
		g = g + char((t % 10) + '0') ;
		t /= 10 ;
	}
	return g ;
}
int main()
{
	int n , m ;
	cin >> n >> m;
	for(int i = 1 ; i <= n ; i ++)
	{
		cin >> a[i] ;
		dp[i] = 0 ;
	}
	dp[0] = 0 ;
	dp[n + 1] = 0;
	for(int i = 0 ; i <= n + 1; i ++)
	{
		long long maxn = 9e18 ;
		int id = 0;
		for(int j = 1 ; j <= m ; j ++)
		{
			if(i - j >= 0)
			{ 
				maxn = min(dp[i - j] + a[i] , maxn);
				if(dp[i - j] + a[i] >= maxn)
				{
					id = i - j ;
				}
				// cout << dp[i - j] + a[i] << endl;
			}
		}
		if(maxn == 9e18) maxn = 0 ;
		dp[i] = maxn;
		// if(id - 1 <= 0) continue ;
		if(i - 1 < 1) continue ;
		ans[i] = ans[i] + " " + ans[id] + " " + to(i - 1) ;
	}
	// cout << ans[11] <<endl;
	cout << dp[n + 1] << endl;
	int sum = 0 , s = 0;
	for(int i = 0 ; i <= ans[n + 1].size() - 1 ; i ++)
	{
		if(ans[n + 1][i] == '-')
		{
			s = 0 ;
			while(ans[n + 1][i] != ' ')
			{
				i ++ ;
			}
			i -- ;
		}
		if(ans[n + 1][i] >= '0' && ans[n + 1][i] <= '9') 
		{
			s = s * 10 + ans[n + 1][i] - '0' ;
		}
		if(ans[n + 1][i] == ' ')
		{
			if(s > 0)
			{
				op[++ sum] = s ;
				s = 0 ;
				// sum ++;
			}
			s = 0 ;
		}
	}
	// cout << ans[n + 1] << endl;
	if(s > 0) op[++ sum] = s ;
	cout << sum << endl;
	for(int i = 1 ; i <= sum ; i ++)	cout << op[i] << " " ;
	// cout << ans[n + 1] << endl;
	return 0;
}

求大佬调代码,有需要数据私信我

求解!!!!!!!!!!!!!!!!!! 【悬赏】

2025/1/21 11:26
加载中...