挑选代表

挑选代表

https://www.nowcoder.com/practice/c563cc42459d49d5923b3460ba142cf8?tpId=98&tqId=32874&tPage=3&rp=3&ru=%2Fta%2F2019test&qru=%2Fta%2F2019test%2Fquestion-ranking

题目难度:三星
考察点:贪心

方法:贪心

1.分析:

这个题我们再来明确一下题意,有n个闭区间[a,b],现在需要在每个闭区间中选择两个数,要求的是选出来的数的个数最少,拿样例来说:
4
4 7
2 4
0 2
3 6
可以从第一个区间中选择:4,5,6,7
可以从第二个区间中选择:2,3,4
可以从第三个区间中选择:0,1,2
可以从第四个区间中选择:3,4,5,6
那么显然我们可以选出四个数字1,2,4,5,这样能够保证每个区间能够选择两个数且选择出来的个数是最少的是4个。即:
第一个区间选择的是4和5
第二个区间选择的是2和4
第三个区间选择的是1和2
第四个区间选择的是4和5
我们可以选择贪心的做法,首先按照右端点进行排序,若右端点相同,则按照左端点从小到大排序。这样就可以保证,如果给出的n个区间存在包含关系,那么被包含的区间一定出现在包含区间之上。接下来,如果条件是至少选择一个数的话,就只要选择区间的右端点即可。那么现在是至少选择两个数,那么我们可以进行一些判断,首先用l,r表示上一个处理的区间坐标,如果当前区间与上一个区间即[l,r]存在交叉关系,那么如果满足r-a[i].x < 1,即它们正好只交叉了一个点,此时ans就要+1,且更新r= a[i].y。如果两个区间不存在交叉关系,即是相互隔离的,那么就更新ans+=2,且更新l = a[i].x; r = a[i].y,直到遍历完整个区间,然后输出ans即可。
算法实现:
(1). 输入n个区间的起始坐标。
(2). 将这n个区间按照右端点进行从小到大排序。
(3). 按照上述的贪心做法进行处理,得到ans。
(4). 输出结果ans。

2.复杂度分析:

时间复杂度:O(n*log(n)) 
空间复杂度:O(n)

3.代码:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e4+5;
struct Node {
    int x, y;
}a[MAXN];
bool cmp(Node A, Node B) {
    if(A.y == B.y) return A.x < B.x;
    return A.y < B.y;
}
int main(){
    int n; cin>>n;
    for(int i=0; i<n; i++) cin>>a[i].x>>a[i].y;
    sort(a, a+n, cmp);
    int ans = 2, l = a[0].x, r = a[0].y;
    for(int i=1; i<n; i++) {
        if(r >= a[i].x) {
            if(r-a[i].x < 1) {
                ans++;
                r = a[i].y;
            }
        }
        else {
            ans += 2;
            l = a[i].x;
            r = a[i].y;
        }
    }
    cout<<ans<<endl;
    return 0;
}


全部评论
cmp里“若右端点相同,则按照左端点从大到小排序”错了 代码里“if(A.y == B.y) return A.x < B.x;” 左端点从小到大排序的。
点赞 回复 分享
发布于 2020-05-11 15:58
有一个疑问: 当前后两个数组重合的数字个数超过一个的时候(r-a[i].x >= 1 ),是怎么处理的,代码里体现为两个if都不满足,直接到i++了。 这是不是有点问题。。。
点赞 回复 分享
发布于 2020-05-11 16:01
代码里有关l的赋值冗余 没用到 可以删掉
点赞 回复 分享
发布于 2020-05-11 16:01

相关推荐

02-25 11:29
产品经理
牛客444597598号:兄弟 我只能说如果想找产品经理这种简历 基本就是毕业失业了 你这连实习都找不到的 简历跟产品经理一点都没有关系,你可以去搜搜产品的模版吧
点赞 评论 收藏
分享
02-15 17:05
已编辑
东华理工大学 前端工程师
Beeee0927:我建议是精简一点吧,比如主修的课程,技能特长,自我评价我是觉得可以删掉了。然后项目经历可能要考虑怎么改得更真实一点,因为就我看起来感觉里面太多的东西像是在实际项目中才能接触到的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务