爱喝两碗汤 2022-08-26 17:30 采纳率: 0%
浏览 35

有n个西瓜准备分给m个同学,n个西瓜自左到右排成一排,从最左边选若干个西瓜分给第一个同学,再从剩余西瓜的最左边选若干个西瓜分给第二个同学,以此类推,希望最多的那份西瓜越少越好,问最多的那份最少能到多少

要求:
输入:两行,第一行是n和m,第二行是各西瓜的重量
输出:最多那份重量的最小值

#include <iostream>
using namespace std;

int n;
int m;
long long ans=INT_MAX;
long long a[10005];
long long b[505];
long long sum=0;

void dfs(int x,int y,long long b[],long long cur,long long sub)
{
    if(x>n)
    {
        return;
    }
    if(y==m)
    {
        ans=min(ans,max(cur,sub));
        return;
    }
    int temp=0;
    for(int i=x;i<=n;i++)
    {
        temp+=a[i];
        if(cur<temp)
        {
            cur=temp;
        }
        b[y]=temp;
        dfs(i+1,y+1,b,cur,sub-temp);
        b[y]=0;
    }
}

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    dfs(1,1,b,0,sum);
    cout<<ans; 
    return 0;
}

尝试用深搜解决,可实现基本功能但运行超时,求解🙏

  • 写回答

1条回答 默认 最新

  • 寒冬i 2022-08-26 18:01
    关注

    用深搜太麻烦了吧,直接相除然后向上取余不就行了

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
        int m,n,s;
        cin>>n>>m;
        s=ceil(n*1.0/m);//向上取整
        cout<<s<<endl;
        return 0;
    }
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 8月26日