lonely_a_life • 4年前
/* 哎希,,,,,,之前一直没写对 , 因为把 跳出条件写在if内了 。。 呜呜呜········
当然选点当然是在选定一个区域的点时能将下一个区域一起覆盖进去的好啦~
所以 , 我们先对房子们的选定范围以后坐标进行排序 (为什么 ? 因为要做要不重不漏, 有要最大化选点遍历范围 ,以致把所有点都选在区域的最后)
然后····
然后就判断后一区域的被前一个点覆盖的点还有需要加的点就行了。 算法简单实际。算法复杂度感觉并不明显(但应该大于O(N) < X < O(N ^ 2)?)
(有点菜对不起)
*/
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int x , y , u;
}a[100001];
int n , m;
bool cmp (node a , node b){
return a.y < b.y;
}
bool used[100001] = {0};
void init(){
cin >> n >> m;
int i , j ;
for(i = 1;i <= m;i++){
cin >> a[i].x >> a[i].y >> a[i].u;
}
sort(a + 1 , a + m + 1 , cmp);
}
void solve(){
int i , k , j , ans = 0;
for(i = 1 ;i <= m;i++){
k = 0;
for(j = a[i].x;j <= a[i].y;j++){
if(used[j])k ++;
}
if(k >= a[i].u) continue;
for(j = a[i].y;j >= a[i].x;j --){
if(!used[j]){
used[j] = 1;
k ++;
ans ++;
}
if(k == a[i].u)break;
}
}
cout << ans << endl;
}
int main(){
init();
solve();
return 0;
}
评论:
请先登录,才能进行评论