线段覆盖

题目描述 Description

    给定x轴上的N(0


输入描述 Input Description

    输入第一行是一个整数N。接下来有N行,每行有二个空格隔开的整数,表示一条线段的二个端点的坐标。


输出描述 Output Description

    输出第一行是一个整数表示最多剩下的线段数。


样例输入 Sample Input
3
6  3
1  3

2  5


样例输出 Sample Output

2


数据范围及提示 Data Size & Hint

0

先吐槽自己没有看清题OTL, 理解成输几组线段上去,然后去掉连段里面的重合部分,合并相连接的部分,然后输出剩下的线段(搞复杂了)2333

错误代码如下:

#include 
#include 
#include 
#include 
using namespace std;
struct points				//线段坐标
{
	int a;
	int b;
};
bool operator<(const points & m, const points & n)  //给sort()用的
{
	return m.a < n.a;

}
int main()
{
	int n, a, b, temp;
	points T;
	cin >> n;
	vector line;
	for (int i = 1; i <= n; i++)
	{
		cin >> a >> b;
		if (a > b)
		{
			temp = a;
			a = b;                    //确保a::iterator pr1, pr2;      
	sort(line.begin(), line.end());     //先按照坐标左端点排序
	int lines = n;
	for (pr1 = line.begin(); pr1 != line.end(); ) 
	{
		for (pr2 = pr1 + 1; pr2 != line.end();)
		{
			if (pr2->a < pr1->b)             //判断线段是否相交
			{
				if (pr2->b > pr1->b)		// 判断线段是否被包括了
				{
					temp = pr1->b;
					pr1->b = pr2->a;
					pr2->a = temp;
				}
				else
				{
					temp = pr1->b;
					pr1->b = pr2->a;
					pr2->a = temp;
				}

			}
			else if (pr1->b == pr2->a)        //相连接就合并
			{
				pr1->b = pr2->b;
				pr2->a = pr2->b;
			}

			if ((pr2->b - pr2->a) == 0)     //判断线段是否减少
			{
				lines--;
				pr2 = line.erase(pr2);
			}
			else
				pr2++;

		}
		if (pr1->b - pr1->a == 0)    //判断线段是否减少
		{
			lines--;
			pr1 = line.erase(pr1);
		}
		else
			pr1++;
	}
	cout << lines;
	return 0;
}



下面是AC的代码:

#include 
#include 
#include 
#include 
using namespace std;
struct points
{
	int a;
	int b;
};
bool operator<(const points & m, const points & n)
{
	return m.a < n.a;

}
int main()
{
	int n, a, b, temp;
	points T;
	cin >> n;
	vector line;
	int * exist = new int[n+1];
	for (int i = 1; i <= n; i++)
	{
		cin >> a >> b;
		if (a > b)
		{
			temp = a;
			a = b;
			b = temp;
		}
		T.a = a;
		T.b = b;
		line.push_back(T);
		exist[i] = 1;
	}
	vector::iterator pr1, pr2;
	sort(line.begin(), line.end());
	int i, j;
	for (pr1 = line.begin() ,i = 1; pr1 != line.end(); i++,pr1++)
	{
		for (pr2 = line.begin(), j = 1; pr2 != pr1; pr2++ , j++)
		{
			if (pr2->b <= pr1->a)
			{
                		exist[i] = max(exist[i], exist[j]+1);    //记录没有覆盖的线段数
			}
		}

	}
	int ans = 1;
	for (int i = 1; i <= n; i++)
        if (exist[i] > ans)
            ans = exist[i];
	cout << ans;
	return 0;
}


你可能感兴趣的:(维基oi,算法,贪心,algorithm,c++)