值周
值周
https://ac.nowcoder.com/acm/problem/24636
思路:贪心+离散化
对离散化有点误解,想把每个区间的点映射成一个小的点,但因为每个点的大小与结果有关,这样不好实现,想了我好久,看了大佬的代码后豁然开朗。
1.按左区间升序排序,如果左区间相同就按右区间升序排序,统计被移走的人数。
2.第一个区间被移走的人数是,标记右区间。
3.如果区间i的左区间比end大,移走的人数是,标记右区间。
4.如果区间i的右区间不小于end,移走的人数是,标记右区间。
5.答案就是。
Code:
#include<bits/stdc++.h> #define js ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) using namespace std; typedef long long ll; const int maxn = 1e6+7; pair<int, int> a[maxn];//先first升序,后second升序 int main() { js; int n,m,l,r; cin>>n>>m; for(int i=1;i<=m;++i) cin>>l>>r,a[i]=make_pair(l,r); sort(a+1,a+1+m); int sum=a[1].second-a[1].first+1,end=a[1].second; for(int i=2;i<=m;++i) { if(a[i].first>end) { sum+=a[i].second-a[i].first+1; end=a[i].second; } else if(a[i].second>=end) { sum+=a[i].second-end; end=a[i].second; } } cout<<n-sum+1<<"\n"; }
牛客算法竞赛入门课第一节例题、习题 文章被收录于专栏
为雨巨打call