#include "iostream"
#include "fstream"
#include "queue"
using namespace std;
/*
每次覆盖尽可能多的点
*/
int x[50];
int greedy(int n, int k)
{
sort(x, x+n); //将各点坐标排序
int i = 1;
int dist = 0;
int d;
int count = 0;
int t; //记录覆盖区间最右边
while(i<n)
{
d = x[i] - x[i-1];
if(dist + d > k) //如果加上与下一个点之间的距离大于固定区间长度
{
dist = 0;
count++;
t = i-1;
}
dist += d;
++i;
}
if(t < n) //如果剩余的点之间的距离和不够k,也应该用一个新的区间覆盖
count++;
return count;
}
int main()
{
ifstream fin("区间覆盖.txt");
int n, k;
cout << "输入点的数量:";
fin >> n; cout << n;
cout << "\n输入固定闭区间长度:";
fin >> k; cout << k;
cout << "\n输入各点坐标:\n";
int i, j;
for(i=0; i<n; i++)
{
fin >> x[i]; cout << x[i] << " ";
}
cout << "\n最少区间数为:" << greedy(n, k);
cout << endl;
fin.close();
return 0;
}
区间覆盖问题
最新推荐文章于 2022-04-04 20:09:50 发布