时间限制: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;
}
求大佬调代码,有需要数据私信我
求解!!!!!!!!!!!!!!!!!! 【悬赏】