collection
银行家算法
时间分配
题目链接
首先建图,一个考试的两个时间为两个点,之间连一条边为考试。
若图存在环的话,那么答案就是点的最大值;
若为链形的,那么就是第二大的值。
维护的方式有二分、hull定理,DSU。。。
题解
ac code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #include <bits/stdc++.h> using namespace std; #define N 2001000 struct node { int x,y; }a[N]; int n,cc,cnt,ans; int h[N],f[N]; int get(int x) {return x==f[x] ? x : f[x]=get(f[x]);} int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y),h[++cc]=a[i].x,h[++cc]=a[i].y; sort(h+1,h+cc+1); cnt=unique(h+1,h+cc+1)-h-1; for (int i=1;i<=n;i++) { a[i].x=lower_bound(h+1,h+cnt+1,a[i].x)-h; a[i].y=lower_bound(h+1,h+cnt+1,a[i].y)-h; } for (int i=1;i<=cnt;i++) f[i]=i; for (int i=1;i<=n;i++) { int x=a[i].x,y=a[i].y; x=get(x); y=get(y); if (!x && !y) { puts("-1"); return 0; } if (x>y) swap(x,y); if (x==y || !x || !y) ans=max(ans,max(h[x],h[y])),f[x]=f[y]=0; else ans=max(ans,min(h[x],h[y])),f[x]=y; } printf("%d\n",ans); return 0; }
|
未解决的问题