日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Codeforces Round #433(Div. 2) D. Jury Meeting(贪心)

發(fā)布時(shí)間:2025/3/21 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Codeforces Round #433(Div. 2) D. Jury Meeting(贪心) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:Codeforces Round #433(Div. 2) D. Jury Meeting

題意:

有n個(gè)城市,每個(gè)城市有一個(gè)人,現(xiàn)在要讓這些人來0號城市在一起k天,然后回去。

現(xiàn)在有m個(gè)日程表,每個(gè)日程表有出發(fā)時(shí)間,出發(fā)城市,到達(dá)城市(出發(fā)城市和到達(dá)城市其中一個(gè)為0),價(jià)錢。

現(xiàn)在讓你安排一個(gè)日程,使得用的總的錢最少。

題解:

對于每個(gè)城市的日程表去組合顯然復(fù)雜度太大。

考慮雙指針的思想。在一起k天,就相當(dāng)于要對每個(gè)城市找一個(gè)左端點(diǎn)和右端點(diǎn),構(gòu)成一條線段,然后n個(gè)城市構(gòu)成n條線段,使得這n條線段的重疊部分大于等于k。

那么我們考慮枚舉每個(gè)k的起點(diǎn)L,顯然在L左邊,每個(gè)城市都要有左端點(diǎn)才行,對于每個(gè)城市如果有多個(gè)左端點(diǎn),顯然取最便宜的那個(gè)。

右端點(diǎn)同理。

然后就可以先預(yù)處理出:截止第i天,n個(gè)城市的人全部到達(dá)0號城市的最小花費(fèi),和全部回去的最小花費(fèi)。

然后掃一遍更新一下答案就行了。

1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 typedef long long ll; 5 6 const int N=1e5+7; 7 const ll inf=1ll<<61; 8 int n,m,k; 9 ll dp[N*10][2],val[N]; 10 struct Node 11 { 12 int day,op,aim,cost; 13 Node(int a=0,int b=0,int c=0,int d=0):day(a),op(b),aim(c),cost(d){} 14 bool operator<(const Node &B)const{return day<B.day;} 15 }a[N]; 16 17 int main(){ 18 scanf("%d%d%d",&n,&m,&k); 19 F(i,1,m) 20 { 21 int aa,b,c,d; 22 scanf("%d%d%d%d",&aa,&b,&c,&d); 23 if(c==0)a[i]=Node(aa,0,b,d); 24 else a[i]=Node(aa,1,c,d); 25 } 26 sort(a+1,a+1+m); 27 F(i,1,n)val[i]=inf; 28 int ed=1,cnt=0;ll sum=0; 29 F(i,1,1000000) 30 { 31 while(ed<=m&&i>=a[ed].day) 32 { 33 if(a[ed].op){ed++;continue;} 34 if(val[a[ed].aim]==inf) 35 { 36 cnt++,val[a[ed].aim]=a[ed].cost; 37 sum+=a[ed].cost; 38 } 39 else if(val[a[ed].aim]>a[ed].cost) 40 { 41 sum+=a[ed].cost-val[a[ed].aim]; 42 val[a[ed].aim]=a[ed].cost; 43 } 44 ed++; 45 } 46 if(cnt==n)dp[i][0]=sum; 47 else dp[i][0]=inf; 48 } 49 ed=m,cnt=0,sum=0; 50 F(i,1,n)val[i]=inf; 51 for(int i=1000000;i>=1;i--) 52 { 53 while(ed>=1&&i<=a[ed].day) 54 { 55 if(!a[ed].op){ed--;continue;} 56 if(val[a[ed].aim]==inf) 57 { 58 cnt++,val[a[ed].aim]=a[ed].cost; 59 sum+=a[ed].cost; 60 } 61 else if(val[a[ed].aim]>a[ed].cost) 62 { 63 sum+=a[ed].cost-val[a[ed].aim]; 64 val[a[ed].aim]=a[ed].cost; 65 } 66 ed--; 67 } 68 if(cnt==n)dp[i][1]=sum; 69 else dp[i][1]=inf; 70 } 71 ll ans=inf; 72 F(i,1,1000000) 73 { 74 if(i+k+1>1000000)continue; 75 ans=min(ans,dp[i][0]+dp[i+k+1][1]); 76 } 77 printf("%lld\n",ans==inf?-1:ans); 78 return 0; 79 } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/bin-gege/p/7489125.html

總結(jié)

以上是生活随笔為你收集整理的Codeforces Round #433(Div. 2) D. Jury Meeting(贪心)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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