NY 891 找点

时间限制: 2000 ms  |  内存限制: 65535 KB
难度: 2
描述

上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?

输入
多组测试数据。
每组数据先输入一个N,表示有N个闭区间(N≤100)。
接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点。
输出
输出一个整数,表示最少需要找几个点。
样例输入
4
1 5
2 4
1 4
2 3
3
1 2
3 4
5 6
1
2 2
样例输出
1
3

1

思路:贪心问题,下面给出分别以左端点和右端点的两个AC代码。左端点排序AC:

#include<iostream>
#include<algorithm>
using namespace std;
struct inp{
	int x,y;
}node[101]; 
bool cmp(inp a,inp b){
	return a.x<b.x;
}
int main(){
	int n,i,sum;
	while(cin>>n){
		sum=0;
		for(i=0;i<n;i++)
		   cin>>node[i].x>>node[i].y;
		sort(node,node+n,cmp);
		for(i=0;i<n-1;i++){
			if(node[i+1].x>node[i].y)
			  sum++;
			else     //这一步的作用(举个例子,3个区间分别为[1,4],[1,5],[5,6],比较前两个后
			  node[i+1].y=min(node[i].y,node[i+1].y); //这时应根据题将之前比较的结果4与5比较,而不是将5与5比较
		}
		cout<<sum+1<<endl;
	}
	return 0;
}

右端点排序AC代码:

#include<iostream>
#include<algorithm>
using namespace std;
struct inp{
	int x,y;
}node[101]; 
bool cmp(inp a,inp b){
	return a.y<b.y;
}
int main(){
	int n,i,sum,ans;
	while(cin>>n){
		sum=0;
		for(i=0;i<n;i++)
		   cin>>node[i].x>>node[i].y;
		sort(node,node+n,cmp);
		ans=node[0].y;
		for(i=1;i<n;i++){
			if(ans<node[i].x){    //原理同第一个,就是以右端点排序而已
				sum++;
				ans=node[i].y;
			}
		}
		cout<<sum+1<<endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCvSharp是基于OpenCV的C#语言接口,可以方便地在C#中使用OpenCV的功能。对于Canny边缘检测算法,OpenCV提供了cv::Canny函数进行处理,不过该函数只能返回二值化的边缘图像,不能返回亚像素级别的边缘信息。如果需要获取亚像素级别的边缘信息,可以使用OpenCV提供的cv::findContours函数配合近似多边形算法进行处理。 下面是一个基于OpenCvSharp实现的FindSubPixelEdge函数的示例代码: ```csharp public static Point[] FindSubPixelEdge(Mat src, int threshold1, int threshold2) { Mat edges = new Mat(); Cv2.Canny(src, edges, threshold1, threshold2); Mat contours = new Mat(); Cv2.FindContours(edges, out contours, out _, RetrievalModes.List, ContourApproximationModes.ApproxTC89KCOS); Point[][] approx = new Point[contours.Rows][]; for (int i = 0; i < contours.Rows; i++) { approx[i] = Cv2.ApproxPolyDP(contours.Row(i), Cv2.ArcLength(contours.Row(i), true) * 0.02, true); } Point[] subPixelEdges = new Point[approx.Length]; for (int i = 0; i < approx.Length; i++) { if (approx[i].Length >= 2) { double dx = approx[i][1].X - approx[i][0].X; double dy = approx[i][1].Y - approx[i][0].Y; double dist = Math.Sqrt(dx * dx + dy * dy); if (dist > 0) { double nx = dy / dist; double ny = -dx / dist; double sumX = 0, sumY = 0, sumWeight = 0; for (int j = 0; j < approx[i].Length; j++) { double x = approx[i][j].X; double y = approx[i][j].Y; double weight = Math.Abs(nx * (x - approx[i][0].X) + ny * (y - approx[i][0].Y)); sumX += x * weight; sumY += y * weight; sumWeight += weight; } subPixelEdges[i] = new Point(sumX / sumWeight, sumY / sumWeight); } } } return subPixelEdges; } ``` 该函数的主要思路是先使用Canny算法进行边缘检测,并使用findContours函数获取边缘轮廓信息。然后使用近似多边形算法对边缘轮廓进行简化,得到亚像素级别的边缘点信息。最后使用加权平均计算每个边缘点的精确位置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值