华为机试0828||参加博览会
第三题
题目:参加博览会
有n场编号从0到n−1的博览会将要举办,编号为i的的博览会举办时间为[starti,endi],即从第starti天到第endi天,包含第starti天和第endi天。
小明计划参加这些博览会,每天最多可以参加k场博览会。请问小明最多可以参加多少场博览会。需注意,小明不需要全程参加一场博览会,只需要在某一天参加即可。
输入描述
第一行输入包含两个整数n和k,n表示博览会的数量,k表示每天最多可以参加的博览会的数量,1≤n≤10^4,1≤k≤10。
以下n行每行包含两个整数start和end,表示第i场博览会的举办时间,1≤starti≤endi≤10^9。
输出描述
小明最多能参加的博览会数量。
样例输入一
3 1 1 2 2 3 1 1
样例输出一
3
说明
小明每天可以参加1场博览会,那么他可以在第1天参加第三场博览会,第2天参加第一场博览会,第3天参加第二场博览会,因此最多可以参加3场博览会。
样例输入二
5 2 1 1 2 2 1 2 2 2 1 1
样例输出二
4
说明
小明每天可以参加2场博览会,那么他可以在第1天参加第一场博览会和第五场博览会,第2天参加第二场博览会和第三场博览会,因此最多可以参加4场博览会。
题解:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,k; 4 bool cmp(const pair<int,int>&a,const pair<int,int>&b){ 5 return a.first<b.first; 6 } 7 void Work(const vector<pair<int,int>>&a){ 8 int time_=0; 9 priority_queue<int,vector<int>,greater<int> >pri; 10 int idx=1,ans=0; 11 while(idx<=n||!pri.empty()){ 12 while(!pri.empty()&&pri.top()<time_)pri.pop(); 13 while(idx<=n&&a[idx].first<=time_){ 14 pri.push(a[idx].second); 15 idx++; 16 } 17 for(int i=1;i<=k;i++){ 18 if(!pri.empty()){ 19 ans++; 20 pri.pop(); 21 } 22 else break; 23 } 24 if(pri.empty())time_=a[idx].first; 25 else time_++; 26 } 27 cout<<ans; 28 } 29 int main(){ 30 ios_base::sync_with_stdio(false); 31 cin.tie(NULL); 32 cin>>n>>k; 33 vector<pair<int,int>>a(n+1); 34 for(int i=1;i<=n;i++){ 35 int s,e; 36 cin>>s>>e; 37 a[i]=make_pair(s,e); 38 } 39 sort(a.begin(),a.end(),cmp); 40 Work(a); 41 }
by:AlenaNuna