zoukankan      html  css  js  c++  java
  • BZOJ 1899&&luogu P2577: [Zjoi2004]Lunch 午餐 贪心+DP

    贪它,再大力DP(话说觉得此题简单的真的是大佬QAQ)我想了两天。。。QWQ


    贪心:吃饭慢的先打饭(不太会证。。。)

    DP:f[i][j]表示前i个人,在1号窗口打饭的总时间时j,的最短时间

      确定i的时候,通过j,可以算出在二号窗口打饭的总时间。。

    所以有:

      第i个人在1号窗口:if(j>=a[i].t) f[i][j]=min(f[i][j],max(f[i-1][j-a[i].t],j+a[i].w));

      第i个人在2号窗口:f[i][j]=min(f[i][j],max(f[i-1][j],d[i]-j+a[i].w));

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #define R register int
    using namespace std;
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    struct node{int t,w; bool operator <(const node& y)const{return w>y.w;}}a[100010];
    int n,f[210][40010],d[210],ans=0x3f3f3f3f;
    signed main() {
        n=g(); for(R i=1;i<=n;++i) a[i].t=g(),a[i].w=g();
        sort(a+1,a+n+1); memset(f,0x3f,sizeof f); f[0][0]=0;
        for(R i=1;i<=n;++i) d[i]=d[i-1]+a[i].t; 
        for(R i=1;i<=n;++i) for(R j=0;j<=d[i];++j) {
            if(j>=a[i].t) f[i][j]=min(f[i][j],max(f[i-1][j-a[i].t],j+a[i].w));
            f[i][j]=min(f[i][j],max(f[i-1][j],d[i]-j+a[i].w));
        } for(R i=0;i<=d[n];++i) ans=min(ans,f[n][i]); printf("%d
    ",ans);
    } 

    然后可以顺便压成一维的。。。(不知为何跑的飞快QAQ)

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #define R register int
    using namespace std;
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    struct node{int t,w; bool operator <(const node& y)const{return w>y.w;}}a[100010];
    int n,f[40010],d[210],ans=0x3f3f3f3f;
    signed main() {
        n=g(); for(R i=1;i<=n;++i) a[i].t=g(),a[i].w=g();
        sort(a+1,a+n+1); memset(f,0x3f,sizeof f); f[0]=0;
        for(R i=1;i<=n;++i) d[i]=d[i-1]+a[i].t; 
        memset(f,0x3f,sizeof f); f[0]=0;
        for(R i=1;i<=n;++i) for(R j=d[i-1];j>=0;--j){
            f[j+a[i].t]=min(f[j+a[i].t],max(f[j],j+a[i].t+a[i].w));
            f[j]=max(f[j],d[i-1]-j+a[i].t+a[i].w);
        } for(R i=0;i<=d[n];++i) ans=min(ans,f[i]); printf("%d
    ",ans);
    }

    2019.04.07/08

  • 相关阅读:
    # 抗战电视剧《河山》观后感 #
    SAP MM 自定义条件类型出现在采购信息记录的'条件'界面里 ?
    SAP 对HU做转库操作,系统报错
    SAP MM 采购订单与相关合同的价格差异问题分析
    2019年终总结之SAP项目实践篇
    大学教师,要做教授,请不要做叫兽!
    SAP MM 一个含有多个账号分配对象的行项目的PO及其收货
    华哥演技好!--- 电视剧《魔都风云》观后感
    SAP 如何看某个TR是否传入了Q或者P系统?
    Linux IO 模型
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10668293.html
Copyright © 2011-2022 走看看