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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班

發(fā)布時(shí)間:2023/12/10 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

思路:可以貪心,也可以最短路。

貪心寫法:因?yàn)樵诒WC合法的前提下,我們選擇的區(qū)間一定要右端點(diǎn)盡量靠后才行,于是我們每次就選擇一個(gè)合法的并且右端點(diǎn)最靠后的區(qū)間就好了(如果沒有合法的輸出-1即可)。時(shí)間復(fù)雜度O(nlogn)(排序是nlogn的,貪心是O(n)的)。

#include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define maxn 25005int n,t,ans; int last[1000005];struct node{int l,r;bool operator <(const node &a)const{return l<a.l||(l==a.l&&r<a.r);} }a[maxn];inline int read(){int x=0;char ch=getchar();for (;ch<'0'||ch>'9';ch=getchar());for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x; }int main(){n=read(),t=read();for (int i=1;i<=n;i++) a[i].l=read(),a[i].r=read();sort(a+1,a+n+1);int cnt=0;for (int i=1;i<=n;i++)if (a[i].l!=a[i+1].l) a[++cnt]=a[i];n=cnt;int now=0;for (int i=1;i<=n;i++){int x=0;bool flag=0;while (a[i].l<=now+1&&i<=n) x=max(x,a[i].r),i++,flag=1;if (!flag){ans=-1;break;}if (x>now) now=x,ans++;i--;}if (now!=t) ans=-1;printf("%d\n",ans);return 0; }

最短路寫法:區(qū)間[l,r]表示可以從l-1走到r,那么我們就把l-1連一條權(quán)值為1的邊到r即可,然后又因?yàn)閰^(qū)間可以有交集,所以還需要將i向i-1連一條權(quán)值為0的邊,然后以0為起點(diǎn)跑最短路即可(以0為起點(diǎn)是因?yàn)槭莑-1連向r)。時(shí)間復(fù)雜度O(TlogT)

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<cmath> using namespace std; #define maxn 1000005 #define inf 1e9int n,t,tot; int now[maxn],pre[maxn*2],son[maxn*2],val[maxn*2],dis[maxn]; bool vis[maxn];inline int read(){int x=0;char ch=getchar();for (;ch<'0'||ch>'9';ch=getchar());for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';return x; }void add(int a,int b,int c){son[++tot]=b;pre[tot]=now[a];now[a]=tot;val[tot]=c; }void link(int a,int b,int c){add(a,b,c); }struct node{int id,val;node(){}node(int a,int b){id=a,val=b;}bool operator <(const node &a)const{return val>a.val;} }; priority_queue<node> heap;void dijkstra(int x){memset(dis,127,sizeof(dis)),dis[x]=0;heap.push(node(x,0));while (!heap.empty()){node x=heap.top();heap.pop();int id=x.id,v=x.val;if (vis[id]) continue;vis[id]=1;for (int p=now[id];p;p=pre[p])if (dis[son[p]]>v+val[p]) heap.push(node(son[p],dis[son[p]]=v+val[p]));} }int main(){n=read(),t=read();for (int i=1,a,b;i<=n;i++) a=read(),b=read(),link(a-1,b,1);for (int i=1;i<=t;i++) link(i,i-1,0);dijkstra(0);if (dis[t]>1e9) puts("-1");else printf("%d\n",dis[t]);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/DUXT/p/6044799.html

總結(jié)

以上是生活随笔為你收集整理的bzoj3389:[Usaco2004 Dec]Cleaning Shifts安排值班的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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