1 条题解

  • 0
    @ 2025-11-20 16:28:01

    C++ :

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #define N 105
    #define M 55
    #define INF 99999999
    using namespace std;
    priority_queue<int>ac;
    int num[N];
    int n,m;
    int dfsMax=INF;
    int Max = -INF;
    int flag=0;
    int jobTime[M];
    int cmp(const void* a,const void *b)
    {
        return *(int *)b - *(int *)a;
    }
    void dfs(int k)
    {
        if(k==n)
        {
            int temp= -INF;
            for(int i=0;i<m;i++)
            {
                if(temp<jobTime[i]) temp = jobTime[i];
            }
    
            if(temp<Max) Max = temp;
            return;
        }
        else
        {
            for(int i=0;i<m;i++)
            {
    //            if(Max<jobTime[i]+num[k]) continue;//放在这里的时间不知道为什么就会差那么远
                jobTime[i]+=num[k];
    
                //这里进行判断时间比较理想,特别是这个Max的变量,直接利用上一次的结果
                //这里没有弄好就TLE的了!!
                if(jobTime[i]<Max)
                dfs(k+1);
                jobTime[i]-=num[k];
            }
        }
    }
    int main()
    {
    
        int i;
    	scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)
            scanf("%d",&num[i]);
    
        qsort(num,n,sizeof(int),cmp);
    
        for(i=0;i<m;i++)
            ac.push(-num[i]);
    
        for(i=i;i<n;i++)
        {
            int temp = ac.top();
            ac.pop();
            temp-=num[i];
            ac.push(temp);
        }
    
        Max = -INF;
        for(i=0;i<m;i++)
        {
            if(-ac.top()>Max) {Max = -ac.top();}
            ac.pop();
        }
    
        //printf("%d\n",Max);
    
        memset(jobTime,0,sizeof(jobTime));
        dfs(0);
        printf("%d\n",Max);
        return 0;
    }
    

    信息

    ID
    2169
    时间
    2000ms
    内存
    128MiB
    难度
    9
    标签
    递交数
    13
    已通过
    3
    上传者