贪心--区间选点
一、问题描述
数轴上有n个闭区间[ai, bi]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。
输入格式:
第一行一个数字n,表示有n个闭区间。 下面n行,每行包含2个数字,表示闭区间[ai, bi]
输出格式:
一个整数,表示至少需要几个点
输入样例:
在这里给出一组输入。例如:
3
1 3
2 4
5 6
输出样例:
在这里给出相应的输出。例如:
2
二、代码
#include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; int l[n],r[n]; for(int i = 0;i<n;i++) cin>>l[i]>>r[i]; for(int i = 0;i<n-1;i++){//右边界排序 int temp; for(int j = i+1;j<n;j++){ if(r[i]>r[j]){ temp = r[i]; r[i] = r[j]; r[j] = temp; temp = l[i]; l[i] = l[j]; l[j] = temp; } } } int count = 1; int p = r[0]; for(int i = 1;i<n;i++){ int flag = 0; if(p<l[i]){ count++; p = r[i]; } } cout<<count; return 0; }
三、代码思路
先将区间按照右边界大小(即r[i])进行排序,寻找两个不同区间的相同集合,找到了计数器不用加一,找不到就将p移到另一区间的右边界,并且计数器加一
四、解题思路||感想
每次都去“贪心”去找有相同集合的区间,找不到将p移动
其实一开始由于我对动态规划,贪心算法不熟悉,我对这类题总会出现弱逻辑问题,这次也以为应该是错的,就碰巧提交到pta,没想到过了,我也懵逼。