2017年西南民族大學網絡賽之免費WIFI

/*
題目描述
TRDD開了一家免費WiFi體驗店, 所有人都可以免費連接WiFi, 只有一個條件, 你要提前一天預約。今天,TRDD收到了n(1 <= n <=1000)個人的預約, 每個人有一個時間段[L, R] (1 <= L <= R <= 5000)表示這個人預約連接WiFi從L時刻到R時刻。 但是市面上只有一種路由器, 這種路由器單臺最多能同時連接m(n <= 100)臺設備, TRDD想要知道最少使用多少臺路由器就能保證明天每個人都能連上WiFi。
輸入描述:
第一行包含兩個數n(1 <= n <=1000), m (1 <= m <= 100)表示今天有n個人預約, 以及路由單臺最大連接個數m。
之後有n行, 第i行有兩個數字  [L, R] (1 <= L <= R <= 5000) 表示第i個人預約連接WiFi的時間是從L到R。
輸出描述:
輸出一個數字表示TRDD最少需要開啓的路由器的個數。
示例1
輸入

4 1
1 5
2 7
3 4
6 9
輸出

3
*/
#include<bits/stdc++.h>
#include<queue>
using namespace std;
struct A{
	int a,b;
}f[1001];
bool cmp(A x,A y){
	if(x.a==y.a)
		return x.b<y.b;
	return x.a<y.a;
}
int main()
{
	int n,m;
	priority_queue<int,vector<int>,greater<int> > q;
	while(~scanf("%d %d",&n,&m)){
		for(int i=0;i<n;i++){
			scanf("%d %d",&f[i].a,&f[i].b);
		}
		//先按照開始時間從小到大排序,如果開始時間相等,就按照結束時間從小到大排序
		sort(f,f+n,cmp);
		//先把排好序的前m個的結束時間放進隊列
		for (int i = 0; i < m; i++)
			q.push(f[i].b);
		int j=m;
		int count=1;//一個是肯定要的
		while(j<n){
			int temp=q.top();
			//如果前一個的結束時間小於下一個的開始時間,
			//(這裏只能是小於,不能是小於等於,我掉坑裏了)
			//就把下一個入隊列,前一個出隊列,相當於上一個連WIFI的人走了,而下一個可以來了;
			if(temp<f[j].a){
				q.pop();
				q.push(f[j].b);
				j++;
			}
			/*
				否則說明路由器不夠,需要加一個新的路由器;
				加了一個新的路由器,當然是儘量讓最多的人用
				所以能夠連多少個就連多少個;
			*/
			else{
				count++;
				for(int i=0;i<m;i++){
					q.push(f[j++].b);
				}
			}
		}
		printf("%d\n", count);
	}
	return 0;
}

發佈了279 篇原創文章 · 獲贊 66 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章