• 产品排序-DP


    Description

      有一系列产品,给定每个产品的加工时间和冷却成型时间(冷却过程产品之间没有关系,是单独冷却的)。现在你手上有两台机器可以用来加工,你需要安排产品加工的顺序以及去哪台机器加工,使得所有产品都成型的时间最早。机器之间互不相关,可以同时进行工作,一个机器一个时刻只能加工一个产品。

    Input

      第一行一个数n,表示产品个数
      以下n行,每行两个数分别表示产品的加工时间A[i]和冷却时间B[i]。

    Output

      输出只有一个数表示所有产品成型的最早时间。

    Sample Input

    3
    1 4
    3 3
    4 1

    Sample Output

    6

    Hint

    n<=200


    思路:

    参考:https://blog.csdn.net/qq_30303087/article/details/53129784

    DP题:

    先贪心,按照冷却时间从大到小排序

    后DP,f[i][j]表示前i个产品,A机器用时间j完成生产的最短时间

    第i个产品分给A:f[i][j]=max(f[i-1][j-A[i]],j+B[i])

    第i个产品分给B:f[i][j]=max(f[i-1][j],Sum[i-1]-j+A[i]+B[i])=max(f[i-1][j],Sum[i]-j+B[i])

    • Sum[i]表示A[i]的前缀和

    注意:前缀和应该在排序后再统计,而非输入时;


    代码:

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    int n,suma[205],f[205][40005];
    struct fdfdfd{int a,b;}e[205];
    bool cmp(fdfdfd x,fdfdfd y){return x.b>y.b;}
    int main()
    {
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i) scanf("%d%d",&e[i].a,&e[i].b);
    	sort(e+1,e+n+1,cmp);
    	for(int i=1;i<=n;++i) suma[i]=suma[i-1]+e[i].a;
    	memset(f,0x7f,sizeof(f)); f[0][0]=0;
    	for(int i=1;i<=n;++i)
    		for(int j=0;j<=suma[i];++j)
    		{
    			if(j>=e[i].a) f[i][j]=min(f[i][j],max(f[i-1][j-e[i].a],j+e[i].b));
                if(suma[i]-j+e[i].b>=0) f[i][j]=min(f[i][j],max(f[i-1][j],suma[i]-j+e[i].b));
    		}
    	int minn=0x7fffffff;
    	for(int i=0;i<=suma[n];++i) minn=min(minn,f[n][i]);
    	printf("%d
    ",minn);
    	return 0;
    }
    
  • 相关阅读:
    inner join ,left join ,right join 以及java时间转换
    华为机试-整形数组合并
    华为机试-公共字串计算
    两个字符串的最长公共子序列的长度
    华为机试-字符串通配符
    工作中总结的编程小技巧
    C语言高效编程的几招(绝对实用,绝对经典)
    Java float保留两位小数或多位小数
    新浪云、阿里云、百度云、谷歌云、亚马逊云
    java经典40+分析
  • 原文地址:https://www.cnblogs.com/wuwendongxi/p/13221700.html
Copyright © 2020-2023  润新知