zoukankan      html  css  js  c++  java
  • Bzoj 1222: [HNOI2001]产品加工 动态规划

    1222: [HNOI2001]产品加工

    Time Limit: 15 Sec  Memory Limit: 162 MB
    Submit: 486  Solved: 298
    [Submit][Status][Discuss]

    Description

    某加工厂有A、B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成。由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任务又会不同。某一天,加工厂接到n个产品加工的任务,每个任务的工作量不尽一样。你的任务就是:已知每个任务在A机器上加工所需的时间t1, B机器上加工所需的时间t2及由两台机器共同加工所需的时间t3,请你合理安排任务的调度顺序,使完成所有n个任务的总时间最少。

    Input

    输入共n+1行第1行为 n。 n是任务总数(1≤n≤6000)第i+1行为3个[0,5]之间的非负整数t1,t2,t3,分别表示第i个任务在A机器上加工、B机器上加工、两台机器共同加工所需要的时间。如果所给的时间t1或t2为0表示任务不能在该台机器上加工,如果t3为0表示任务不能同时由两台机器加工。

    Output

    最少完成时间

    Sample Input

    5
    2 1 0
    0 5 0
    2 4 1
    0 0 3
    2 1 1

    Sample Output

    9

    HINT

     

    Source

     题解:
    谜一样的动态转移式。。。
    设dp[i]为A机器工作了i个时间,B机器工作了dp[i]个时间。
    则dp[i]=min(dp[j-a],dp[j]+b,dp[j-c]+c).
    分别代表A机器工作,B机器工作,同时工作。。。
    时间最大上限为n*5。
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define INF 1e9
     4 int dp[30010];
     5 int read()
     6 {
     7     int s=0,fh=1;char ch=getchar();
     8     while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
     9     while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
    10     return s*fh;
    11 }
    12 int main()
    13 {
    14     int n,T,i,a,b,c,j,t,mn;
    15     n=read();
    16     T=n*5;//总时间.
    17     for(i=0;i<=T;i++)dp[i]=INF;dp[0]=0;
    18     for(i=1;i<=n;i++)
    19     {
    20         a=read();b=read();c=read();
    21         for(j=T;j>=0;j--)//枚举时间.
    22         {
    23             t=dp[j];dp[j]=INF;
    24             if(a!=0&&j-a>=0)dp[j]=min(dp[j],dp[j-a]);//A机器做第i个任务或不做.
    25             if(b!=0)dp[j]=min(dp[j],t+b);
    26             if(c!=0&&j-c>=0)dp[j]=min(dp[j],dp[j-c]+c);
    27         }
    28     }
    29     mn=INF;
    30     for(i=0;i<=T;i++)mn=min(mn,max(i,dp[i]));
    31     printf("%d",mn);
    32     fclose(stdin);
    33     fclose(stdout);
    34     return 0;
    35 }
    View Code
  • 相关阅读:
    (BFS 二叉树) leetcode 515. Find Largest Value in Each Tree Row
    (二叉树 BFS) leetcode513. Find Bottom Left Tree Value
    (二叉树 BFS DFS) leetcode 104. Maximum Depth of Binary Tree
    (二叉树 BFS DFS) leetcode 111. Minimum Depth of Binary Tree
    (BFS) leetcode 690. Employee Importance
    (BFS/DFS) leetcode 200. Number of Islands
    (最长回文子串 线性DP) 51nod 1088 最长回文子串
    (链表 importance) leetcode 2. Add Two Numbers
    (链表 set) leetcode 817. Linked List Components
    (链表 双指针) leetcode 142. Linked List Cycle II
  • 原文地址:https://www.cnblogs.com/Var123/p/5282502.html
Copyright © 2011-2022 走看看