zoukankan      html  css  js  c++  java
  • [HNOI2001]产品加工

    题目链接

     [HNOI2001]产品加工

    description

    有机器甲乙二者,加工产品者也.今有(n)个产品,加工于甲需耗时间(t_{1}),加工于乙需耗时间(t_{2}),二者同时为其加工需耗时间(t_{3}).(若(t_{i})(0),则表示无法用此方式加工)机器者,专一者也,一时只加工一产品也.试问加工完毕最小时间有几何.

    solution

    挺神奇的一道题.一开始考虑开三个数组(f[][3])表示利用三种方式加工所需最小时间,但不会转移.题解提供了一种非常神奇的状态表示方式.(f[i])表示甲加工时间为(i)时乙加工的最小时长,初始化为(inf).于是我们便可以进行转移:

    $$ f[j]=b?f[j]+b:inf$$

    $$if(a)   f[j]=min(f[j-a],f[j])$$

    $$if(c)
    f[j]=min(f[j],f[j-c]]+c)$$

    参考马前卒前辈的代码初始化方式,只有90分,个人感觉是在初始化时间限制最大值的时候出错了吧.

    code

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #define R register
    #define next mABlCDg
    #define debug puts("mlg")
    using namespace std;
    const ll inf=((ull)1<<63-1);
    ll n;
    ll f[320000],Mxt;
    ll ans;
    int main(){
    	n=read();
    	for(R ll i=1;i<=319999;i++) f[i]=inf;
    	f[0]=0;ans=inf;
    	for(R ll i=1,a,b,c;i<=n;i++){
    		a=read();b=read();c=read();
    		Mxt+=max(a,max(b,c));
    		for(R ll j=Mxt;j>=0;j--){
    			if(b) f[j]+=b;
    			else f[j]=inf;
    			if(a&&j>=a) f[j]=min(f[j],f[j-a]);
    			if(c&&j>=c) f[j]=min(f[j],f[j-c]+c);
    		}
    	}
    	for(R ll i=0;i<=Mxt;i++) ans=min(ans,max(f[i],i));
    	
    	writeln(ans);
    } 
    
  • 相关阅读:
    制作交互式网站风格的移动背景
    HTML5中的一些拖拽成员
    你不一定了解的CSS技巧
    DOS bat上使用MSSQLSERVER服务
    优化你的C语言程序就是这么简单
    编写宏的有效方法
    vba,excel,身份证,照片
    网址收藏
    PowerShell让系统可以执行.ps1文件,开机,关机,在线时间 , Function自定义函数
    按键精灵txt判断
  • 原文地址:https://www.cnblogs.com/ylwtsq/p/13410798.html
Copyright © 2011-2022 走看看