1. 程式人生 > 實用技巧 >牛客 20951 網路優化

牛客 20951 網路優化

題目連結 :網路優化

題目意思:

    題目給出一個1....n的序列,第一行輸入n和m,在下面的m行,每一行有三個數字分別是li,ri,vi,代表著第i條網線對使用者li 到 ri 有用,且最多隻有vi個人相連線。問最多可以有多少人可以同時連線。

題目分析:

    有題目可知,有的點可能被覆蓋好幾次,也可能一次都不行,一開始我是想要將每個點可以被多少個網線覆蓋,在從小到大排序,但是不行,我也不知道為什麼不行。後面知道另一種寫法,就是現在要講的。可以將n個點遍歷一遍,在這之前我們將m條網線拍個序,按照l來排序,如果l相等的話,就先將長度更小的放在前面,長度更大的放在後面。然後進行遍歷,從1到n,在這個過程中就可以將l == i的網線放進優先佇列裡,可以放進去的網線肯定可以為i點服務的,然後將不滿足條件的網線彈出來,比如長度減為0了,或者r < i,這兩種肯定是不行的,所以就可以彈出來了,此時如果優先佇列裡面還有網線的話,那肯定可以為i點服務的。

大概的就這樣了,優先佇列裡是按照r的大小進行排序的,詳細看程式碼:

  

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <queue>
 5 using namespace std;
 6 typedef long long ll;
 7 const int ma = 1e4 + 7;
 8 int n,m;
 9 struct node
10 {
11     int l,r,len;
12     bool operator< (const
node& a) const 13 { 14 if(l == a.l && r == a.r) return len < a.len; 15 else if(l == a.l) return r < a.r; 16 else 17 { 18 return l < a.l; 19 } 20 } 21 } num[ma]; 22 23 struct tr 24 { 25 int rest,r; 26 bool operator
< (const tr& a) const 27 { 28 if(r == a.r) return rest < a.rest; 29 else return r > a.r; 30 } 31 }; 32 33 int main() 34 { 35 while(scanf("%d%d",&n,&m) != EOF) 36 { 37 for(int i = 1; i <= m; i++) 38 { 39 scanf("%d%d%d",&num[i].l,&num[i].r,&num[i].len); 40 }// 用結構體儲存網線, 41 sort(num+1,num+1+m); 42 //網線拍尋 43 int cnt(1),ans(0); 44 // cnt 控制下標 45 priority_queue<tr> q; 46 tr a; 47 for(int i = 1; i <= n; i++) 48 { 49 while(num[cnt].l == i) 50 { 51 q.push({num[cnt].len,num[cnt].r}); 52 cnt++; 53 //將l == i 的網線放進佇列裡,並且進行排序,這樣就會先將r更小的放在隊首,這樣就可以在下面進行刷選 54 } 55 while(!q.empty() && (!q.top().rest || q.top().r < i)) 56 q.pop();//刷選,將沒用的彈掉,以保證後面的資料有效。 57 if(q.empty()) continue;//如果此時佇列不為空,也就是講此時佇列裡的都是有效的, 58 ans++;//所以ans就可以+1了 59 a = q.top(),q.pop(); 60 a.rest--,q.push(a); 61 } 62 cout<<ans<<endl; 63 } 64 return 0; 65 }
網路優化

  寫完之後還是太菜了,唉