日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vijos p1404遭遇战

發(fā)布時間:2024/8/1 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vijos p1404遭遇战 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

[spfa][區(qū)間問題]
背景
你知道嗎,SQ Class的人都很喜歡打CS。(不知道CS是什么的人不用參加這次比賽)。
描述
今天,他們在打一張叫DUSTII的地圖,萬惡的恐怖分子要炸掉藏在A區(qū)的SQC論壇服務(wù)器!我們SQC的人誓死不屈,即將于恐怖分子展開激戰(zhàn),準備讓一個人守著A區(qū),這樣恐怖分子就不能炸掉服務(wù)器了。(一個人就能守住??這人是機械戰(zhàn)警還是霹靂游俠?)
但是問題隨之出現(xiàn)了,由于DustII中風景秀麗,而且不收門票,所以n名反恐精英們很喜歡在這里散步,喝茶。他們不愿意去單獨守在荒無人煙的A區(qū),在指揮官的一再命令下,他們終于妥協(xié)了,但是他們每個人都要求能繼續(xù)旅游,于是給出了自己的空閑時間,而且你強大的情報系統(tǒng)告訴了你恐怖份子計劃的進攻時間(從s時刻到e時刻)。

當然,精明的SQC成員不會為你免費服務(wù),他們還要收取一定的傭金(注意,只要你聘用這個隊員,不論他的執(zhí)勤時間多少,都要付所有被要求的傭金)。身為指揮官的你,看看口袋里不多的資金(上頭真摳!),需要安排一個計劃,雇傭一些隊員,讓他們在保證在進攻時間里每時每刻都有人員執(zhí)勤,花費的最少資金。
格式
輸入格式
第一行是三個整數(shù)n(1≤n≤10000),s和e(1≤s≤e≤90000)。

接下來n行,描述每個反恐隊員的信息:空閑的時間si, ei(1≤si≤ei≤90000)和傭金ci(1≤ci≤300000)。

輸出格式
一個整數(shù),最少需支付的傭金,如果無解,輸出“-1”。

樣例1
樣例輸入1
3 1 5
1 3 3
4 5 2
1 1 1
樣例輸出1[復制]
5
限制

提示

敵人從1時刻到4時刻要來進攻,一共有3名反恐隊員。第1名從1時刻到3時刻有空,要3元錢(買糖都不夠??)。以此類推。

一共要付5元錢,選用第1名和第2名。

來源
SQ CLASS公開編程競賽2008——Problem D
Source: WindTalker, liuichou, royZhang

題目思路
這道題的題目可以這樣概括,有一個區(qū)間[s,t],然后有一些小區(qū)間,來覆蓋整個區(qū)間,可以轉(zhuǎn)成求最短路徑,這里我用SPFA。
可是這樣其實建圖很難建,
幾個易錯誤的地方:
1.比如第一個反恐隊員,可以守[1,6],但是6過后時間其他隊員的錢可能比一個[3,~],還要多,所以這個隊員守的過程中是可以換用其他反恐隊員的,,。[很垃圾的我做的時候并沒有想到這個很坑爹的地方,然而這個地方卻是這道題最巧妙的一個地方。QAQ]
處理方法

for(int i = s; i<=e+1;i++){ ed[++tot]=ii(i,head[i+1],0); head[i+1]=tot;}

每一個都建一條反邊回去,代價即為0,i+1到i的邊,這樣的意思就相當于這個時刻,其他隊員即使開始時間在這個時刻前面也可以跳回去用這個更優(yōu)的隊員。
2.這道題給的數(shù)據(jù)范圍是n[1,10000],時刻點是[1,90000],這個范圍一定要注意,開邊應(yīng)該至少開成[90000+10000],n個人的邊加上90000個時刻的反邊,這里的節(jié)點是時刻,,不要弄成人了。,有些別人的代碼邊開的很大,,其實[90000+10000]就夠了。
3.因為這是區(qū)間,不是單純的點,最好的處理區(qū)間的方法就是加一個1,什么意思,1__2__3__4__5__6,比如這是一個區(qū)間,求[1,5],但是這里的時刻其實是一個“__”,所以其實點的話是[1,6].
……..原諒我說了這么多,我只是越寫越覺得這道題很好QAQ…………

#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; #define LL long long #define cle(x) memset(x,0,sizeof(x)) #define maxcle(x) memset(x,127,sizeof(x)) #ifdef WIN32 #define AUTO "%I64d" #else #define AUTO "%lld" #endif using namespace std; const int N=90050,INF=0x3f3f3f3f,M=10050; int n,s,e; struct ii{int to,ne,v;ii(int to=0,int ne=0,int v=0):to(to),ne(ne),v(v){ } }ed[N+M];//記住不是N,節(jié)點是時間節(jié)點 int head[N],tot; inline int readin(){int res=0;char ch;while((ch = getchar())>'9'||ch<'0');res=ch-'0';while((ch = getchar())>='0'&&ch<='9')res=res*10+ch-'0';return res; } void init(){n=readin(),s=readin(),e=readin();for(int i = 1; i<= n; i++){int x=readin(),y=readin(),z=readin();if(x<=e&&y>=s){x=max(s,x),y=min(e+1,y+1);//區(qū)間加一ed[++tot]=ii(y,head[x],z);head[x]=tot;}}for(int i = s; i<=e+1;i++){ed[++tot]=ii(i,head[i+1],0);head[i+1]=tot;}//建反邊,!!!!可以中途換其他人使其更優(yōu) } bool inq[N]; LL dis[N]; queue<int>q; void spfa() {q.push(s),inq[s]=1;maxcle(dis);dis[s]=0;bool flag=false;while(!q.empty()){int u=q.front();q.pop(),inq[u]=false;for(int i=head[u];i;i=ed[i].ne){int v=ed[i].to;if(dis[v]>dis[u]+ed[i].v){dis[v]=dis[u]+ed[i].v;if(v==e+1)flag=true;if(!inq[v]){inq[v]=true;q.push(v);} }}}if(!flag)printf("-1\n");else printf(AUTO,dis[e+1]); } int main(){freopen("vijos.in","r",stdin);freopen("vijos.out","w",stdout);init();spfa();return 0; }

。。。祝您AC

總結(jié)

以上是生活随笔為你收集整理的vijos p1404遭遇战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。