【USACO 12月5日]クリーニングシフト

説明フェイス質問

子供の頃を甘やかさジョン牛は、彼らはブルペンでどんな汚い事を容認することはできません。ジョンは、このグループは少し古い牛の満足度を持って、彼はブルペンをきれいにするためにそれらのいくつかを雇う必要があった場合は、ジョンの牛がいることがわかった(N(1 \当量N \ \の当量10000)\) クリーニングによるヘッド意欲をいくつかのポケットにお金を稼ぐためにブルペン。

牛のポイ捨てが自然にどこにでも一定期間における牛舎では、彼らはこの時点で必要とされますので、どんな時間は、少なくとも一つの牛が掃除していない必要があります。期間をクリーニングが必要1日から\(M \)秒が始まる、セクション\(E \)第二の端\((0 \ MのLeq \のLeq E \ 86399のLeq)\) ここで注意してくださいつまり、合計時間は、毎日の清掃に必要な、むしろ時点より、秒の期間を指し\(E-M + 1 \ ) 秒。

ジョンは彼らがそれぞれの乳牛から受け入れても構わないと思っている作業計画されています:牛のために、彼女は一日中喜んで寝マットです\(T_1 \ ldots T_2 \)二回目の期間の仕事\((M \当量T_1 \当量\)T_2 \のLeq E) 支払うことが必要です\(S \) $と\((0 \のLeq S \のLeq 500000)\) そして、牛が最初の一日あたりの時間を動作するように喜んでいるかのように、説明した期間をきれいにする必要があります(10 \ ldots 20 \)\秒が、その時は彼女の合計作品です\(11 \)の代わりに、秒\(10 \)第2

ジョンは、あなたが彼女の完全な給料を支払わなければならない、ちょうどいくつかの時間のために彼女の仕事をさせない牛を雇うことを決めた後は、その後、彼女は彼女の給料の割合を決定するために動作するように喜んでいた総時間で、この時間を押してください。今、あなたはジョンが牛は満足できます前提の下で、もちろん、ブルペン清潔に保つために雇われた牛を判断するのに役立ち、ジョンは可能な限り総コストは限り小さくするために期待しています。

入力形式

\(1 \)行:\(3 \)正の整数\(N、M、E \)
第二に\(2 \)(N + 1 \)\:ライン\(I + 1 \)行は、番号与えます\(私は\)すなわち、作業計画の牛を、\(3 \)正の整数を\(T_1、T_2、S \)

出力フォーマット

出力ジョンのブルペンのクリーンアップのために支払うための最低コストを表す整数。クリーンアップ作業が不可能であれば、その後、出力\(--1 \)

サンプル

サンプル入力

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

サンプル出力

5

問題の解決策

あなたは直接貪欲なアプローチを使用することができますが、ここで私は、グラフ理論の考え方が計算されます。
各時間から牛につき一点の組\(私は\)する動作(J \)\点から、すなわちを\は、(私は\)ポイント\(J \)は、有向エッジです。牛が交差することができますので、同じ時間仕事でいる間、私たちはすべてのポイントを取る必要があります\(のp \)をするための出発点として\(P-1 \) さらには裏面を。最後に、我々は出発点からほとんどに短絡に直接終わりが来ます

#include<iostream>
#include<set>
#include<algorithm>
#include<cstdio>
#define maxn 100000
#define maxm 100000
#define X first
#define Y second
using namespace std;
inline char get(){
    static char buf[30000],*p1=buf,*p2=buf;
    return p1==p2 && (p2=(p1=buf)+fread(buf,1,30000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
    register char c=get();register int f=1,_=0;
    while(c>'9' || c<'0')f=(c=='-')?-1:1,c=get();
    while(c<='9' && c>='0')_=(_<<3)+(_<<1)+(c^48),c=get();
    return _*f;
}
typedef pair<int,int> pall;
struct edge{
    int u,v,w,next;
}E[maxm<<1];
int p[maxn],eid=0;
struct cmp{
    bool operator ()(const pall &a,const pall &b)const{
        if(a.Y!=b.Y)return a.Y<b.Y;
        return a.X<b.X; 
    }
};
void init(){
    for(register int i=0;i<maxn;i++)p[i]=-1;
    eid=0; 
}
void insert(int u,int v,int w){
    E[eid].u=u;
    E[eid].v=v;
    E[eid].w=w;
    E[eid].next=p[u];
    p[u]=eid++;
}
void insert2(int u,int v,int w){
    insert(u,v,w);
    insert(v,u,w);
}
int n,m,e;
int dis[maxn],vis[maxn];
void dijkstra(int u){
    for(register int i=0;i<maxn;i++)dis[i]=0x3f3f3f3f,vis[i]=0;
    dis[u]=0;vis[u]=1;
    set<pall,cmp> s;
    s.insert(make_pair(u,0));
    for(register int i=0;i<=n || s.size();i++){
        u=s.begin()->X;
        s.erase(*s.begin());
        vis[u]=1;
        for(register int j=p[u];~j;j=E[j].next){
            int v=E[j].v;
            int w=E[j].w;
            //cout<<u<<" "<<v<<" "<<w<<endl;
            if(!vis[v] && dis[v]>dis[u]+w){
                s.erase(make_pair(v,dis[v]));
                s.insert(make_pair(v,dis[v]=dis[u]+w));
            }
        } 
    }
}
int u,v,w;
int ss[maxn],tt[maxn];
int main(){
    //freopen("1.txt","r",stdin);
    init();
    n=read(),m=read(),e=read();
    //cout<<n<<" "<<m<<" "<<" "<<e<<endl;
    for(register int i=1;i<=n;i++){
        int s=read(),t=read(),w=read();
        insert2(s,t,w);
        insert2(s,t+1,w);
        //cout<<s<<" "<<t<<" "<<w<<endl;
    }
    for(register int i=m;i<=e;i++)insert(i+1,i,0);
    dijkstra(m);
    //for(register int i=1;i<=e;i++)cout<<dis[i]<<" ";
    if(dis[e+1]!=0x3f3f3f3f)cout<<dis[e+1];
    else cout<<-1<<endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/Chen574118090/p/11608689.html