Codeforces 452D [模拟][贪心]

题意:

给你k件衣服处理,告诉你洗衣机烘干机折叠机的数量,和它们处理一件衣服的时间,要求一件衣服在洗完之后必须立刻烘干,烘干之后必须立刻折叠,问所需的最小时间。

思路:

1.按照时间模拟

2.若洗完的衣服或者烘干的衣服较多来不及进行下一个步骤,则从一开始就顺延洗衣服的时间,贪心的思想也是体现在这里。

3.关键在于烘干衣服的顺延如何处理,因为需要调整洗衣服的起始时间,其实我们只要对烘干衣服的时间进行顺延处理就可以了,因为即使没有调整洗衣服的起始时间,那么下次到了烘干衣服的时间的时候因为烘干衣服的数量仍然被占用,所以可以顺次延时洗衣服的起始时间。

4.一开始担心复杂度的问题,但是交了之后发现时间并不多...这个问题还在思考中...

#include<bits/stdc++.h>
using namespace std;
struct st{
    long long time,num;
    int id;
    st(long long a,long long b,int c){
        time=a;id=c;num=b;
    }
};
bool operator < (const st &a,const st &b){
    if(a.time!=b.time)
        return a.time<b.time;
    return a.id>b.id;
}
multiset<st>a;
int main()
{
    int k,n1,n2,n3,t1,t2,t3;
    scanf("%d%d%d%d%d%d%d",&k,&n1,&n2,&n3,&t1,&t2,&t3);
    long long a1,a2;
    a1=a2=0;
    a.insert(st(t1,n1,1));
    while(k>0){
        st tmp=*a.begin();
        a.erase(a.begin());
        //printf("%d %lld %lld
",tmp.id,tmp.time,tmp.num);
        if(tmp.id==1){
            if(n2){
                a.insert(st(tmp.time+t2,min((long long)n2,tmp.num),2));
                a.insert(st(tmp.time+t1,min((long long)n2,tmp.num),1));
            }
            if(tmp.num>n2){
                    a.insert(st(tmp.time+1,tmp.num-n2,1));
            }
            n2-=min((long long)n2,tmp.num);
        }
        else if(tmp.id==2){
            if(n3){
                a.insert(st(tmp.time+t3,min((long long)n3,tmp.num),3));
            }
            if(tmp.num>n3){
                a.insert(st(tmp.time+1,tmp.num-n3,2));
            }
            n2+=min((long long)n3,tmp.num);
            n3-=min((long long)n3,tmp.num);
        }
        else{
            k-=tmp.num;
            n3+=tmp.num;
            if(k<=0){printf("%I64d
",tmp.time);return 0;}
        }
    }
}
原文地址:https://www.cnblogs.com/tun117/p/5335068.html