go channel 緩衝區最大限制_Go併發程式設計模型:主動停止goroutine
阿新 • • 發佈:2021-01-04
技術標籤:演算法
給定 n 個區間 [li,ri],要求合併所有有交集的區間。
注意如果在端點處相交,也算有交集。
思想:貪心
分析:先按區間的左區間從小到大排序,每次判斷每個區間是否可以合併。 狀態轉移方程(right為右區間的最大值):
程式碼:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
struct node{
int l;
int r;
}q[N],a[N];
bool cmp(node a,node b){
return a.l<b.l;
}
int main (){
int n,i,ans=1;
cin>>n;
for(i=0;i<n;i++){
cin>>q[i].l;
cin>>q[i].r;
}
sort(q,q+n,cmp);
int right=q[0].r,left=q[0].l;
for(i=1;i<n;i++){
if(q[i].l>right){
a[ans].l=left;
a[ans].r=right;
ans++ ;
left=q[i].l;
right=q[i].r;
}
else{
right=max(right,q[i].r);
}
}
a[ans].l=left;
a[ans].r=right;
cout<<ans<<endl;//合併後區間個數
//輸出合併後的區間
for(i=1;i<=ans;i++){
cout<<"["<<a[i].l< <","<<a[i].r<<"]"<<endl;
}
}