区间覆盖问题(c语言实现)

6.1题目
算法实现题4-10 区间覆盖问题
★问题描述:设x1,x2,……xn是是直线上的n个点。用固定长度的闭区间覆盖这n个点,至少需要多少个这样的固定长度闭区间?设计解此问题的有效算法,并证明算法的正确性。
★算法设计:对于给定的实直线上的n个点和闭区间的长度k,计算覆盖点集的最少区间数。
数据输入:由文件input.txt给出输入数据。第一行有两个正整数n和k,表示有n个点,且固定长度闭区间的长度为k。接下来的一行中,有n个整数,表示n个点在实直线上的坐标(可能相同)。
★输出结果:将计算的最少区间数输出到文件output.txt。
输入文件示例 输出文件示例
Input.txt output.txt
7 3 3
1 2 3 4 5 -2 6
6.2分析
从第一个开始加上区间的大小减一,所得值与下一个数进行比较,直到有元素比它大为止,将这个值赋值为初始值,开始下一轮循环,若无则结束循环。
6.3源代码

#include 
#include
void sort(float* p, int size);
int main()
{
	FILE* fpr, * fpw;
	fopen_s(&fpr, "input.txt", "r");
	fopen_s(&fpw, "output.txt", "w");
	int j, i, n, s, nn = 0, z;
	float a[100], min, max;
	fscanf_s(fpr, "%d", &n);
	fscanf_s(fpr, "%d", &s);
	for (i = 0; i < n; i++)
		fscanf_s(fpr, "%f", a + i);
	sort(a, n);
	z = min = a[0];
	max = a[n-1];
	for (i = 0; z < max; i++)
	{
		z = z + s - 1;
		nn += 1;
		for (j = i; j < n; j++)
			if (a[j] > z)
			{
				z = a[j];
				break;
			}
	}
	fprintf(fpw, "%d", nn);
	fclose(fpr);
	fclose(fpw);
	return 0;
}
void sort(float* p, int size)//冒泡排序
{
	int i, b[10], j, k;
	for (i = 0; i < size - 1; i++)
		for (j = i + 1; j < size; j++)
			if (p[i] > p[j])
			{
				k = p[i];
				p[i] = p[j];
				p[j] = k;
			}
}

6.4运行结果

6.5总结
开始编程前思路很重要,要是起初的解题思路就有错,那么后续的程序编写也就没有了意义。

你可能感兴趣的:(区间覆盖问题(c语言实现))