规划每分钟需要跑过的音符使得步长总和要尽量小问题

链接:https://www.nowcoder.com/questionTerminal/24a1bb82b3784f86babec24e4a5c93e0?orderByHotValue=1&page=1&onlyReference=false
来源:牛客网
 

[编程题]Shopee的零食柜

        shopee的零食柜,有着各式各样的零食,但是因为贪吃,小虾同学体重日益增加,终于被人叫为小胖了,他终于下定决心减肥了,他决定每天晚上去操场跑两圈,但是跑步太累人了,他想转移注意力,忘记痛苦,正在听着音乐的他,突然有个想法,他想跟着音乐的节奏来跑步,音乐有7种音符,对应的是1到7,那么他对应的步长就可以是1-7分米,这样的话他就可以转移注意力了,但是他想保持自己跑步的速度,在规定时间m分钟跑完。为了避免被累死,他需要规划他每分钟需要跑过的音符,这些音符的步长总和要尽量小。下面是小虾同学听的歌曲的音符,以及规定的时间,你能告诉他每分钟他应该跑多少步长?

 

 

输入描述:

输入的第一行输入 n(1 ≤ n ≤ 1000000,表示音符数),m(1<=m< 1000000, m <= n)组成,

第二行有 n 个数,表示每个音符(1<= f <= 7)


 

输出描述:

输出每分钟应该跑的步长

示例1

输入

8 5
6 5 6 7 6 6 3 1

输出

11

说明

6 | 5 6 | 7 | 6 | 6 3 1  为最优解

如果小于11,必然分段大于5

我的代码如下:

#include<iostream>
using namespace std;
typedef long TYPE;
int max(int[], TYPE);
void get(int a[], TYPE n,TYPE m,TYPE index,TYPE s,TYPE e,TYPE& maxV, TYPE v[],TYPE diff);
long sum(int[], TYPE, TYPE);
const TYPE N=2000000L;
int main(){
    TYPE n,m;
    cin>>n>>m;
    TYPE maxV=0;
    TYPE diff = n-m;
    int a[N]={};
    TYPE v[N]={};
    for(TYPE i=0;i<n;i++){
        cin>>a[i];
    }
    for(TYPE i=0;i<diff;i++)
       get(a,n,m,1,0,i,maxV,v,diff-i);
    cout<<maxV;

return 0;
}
TYPE sum(int a[],TYPE s,TYPE e){
    TYPE res=0;
    for(TYPE i=s;i<e;i++)
            res += a[i];
    return res;
}
 
template<class T>
int maxArry(T a[], TYPE n){
    int maxv = a[0];
    for(TYPE i=1;i<n;i++)
        if(maxv<a[i])
            maxv=a[i];
    return maxv;
}
void get(int a[], TYPE n, TYPE m,TYPE index,TYPE s, TYPE e, TYPE& maxV, TYPE v[],TYPE diff){
    if(s>=n||e>=n){
        return;
    }
    if(m>n) {maxV=maxArry(a,n);return;}
    if(index==m) e=n-1;
    TYPE sumf = sum(a, s,e);
    cout<<sumf<<"sumf"<<endl;
    v[m-1]= sumf;
    if(index==m){
        int tmp = maxArry(v,m);
        if(tmp>maxV)
            maxV=tmp;
        return;
    }
    for(TYPE i;i<diff;i++){
        TYPE j=e+1;
        get(a,n,m,index+1,j,j+i,maxV,v,diff-i);
    }
}

运行结果:

您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为0.00%

暂时先放在这,供大家交流,日后改进。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Poo_Chai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值