一,区间覆盖:
数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定线段[s,t]。
/*
author:杨汝生
time:2014-9-12,16:48
algorithm: 贪心法之区间覆盖问题
*/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
struct Interval {
int start;
int finally;
}intervals[100];
int cmp(const void *a,const void *b) {
struct Interval *aa,*bb;
aa = (struct Interval *)a;
bb = (struct Interval *)b;
return aa->start - bb->start;
}
bool A[100];
int s,t;
void intervalcoverage(int n) { //函数处理,选择区间
int i,j,k;
int big = s;
int temp=0;
for (i=0;i<n;i++) { //选择区间finally值最大的区间
for(j=0;intervals[j].start<=big;j++) {
if(intervals[j].finally>temp) {
temp = intervals[j].finally;
k = j;
}
}
A[k] = true;
big = intervals[k].finally;
if(big>=t) {
break;
}
}
}
int main() {
int n,i,j;
printf("请输入覆盖区间:");
scanf("%d%d",&s,&t) ;
printf("请输入区间个数:\n");
scanf("%d",&n);
printf("请输入区间:\n");
for(i=0;i<n;i++) {
scanf("%d %d",&intervals[i].start,&intervals[i].finally);
}
qsort(intervals,n,sizeof(struct Interval),cmp);
int judge = 0;
for(i=0;i<n;i++) {
if(t<=intervals[i].finally) {
judge = 1;
break;
}
}
if(s<intervals[0].start || !judge) {
printf("不能覆盖区间:%d %d\n",s,t);
}
else {
intervalcoverage(n);
for(i=0;i<n;i++) {
if(A[i]==true) {
printf("选择的区间为:");
printf("%d %d ",intervals[i].start,intervals[i].finally);
}
}
printf("\n");
}
return 0;
}
二,区间选点:
数轴上有n个闭区间[ai,bi]。去尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)。
/*
author:杨汝生
time:2014-9-13,00:48
algorithm: 贪心法之区间选点问题
*/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
int A[100]; //记录所取得点
int sum=0;
struct Interval {
int start;
int finally;
}intervals[100];
void GreedySelector(int n) { //函数处理
int big;
big = intervals[0].finally;
A[sum++] = big;
int i,j=0;
for (i=1;i<n;i++) { //选择区间finally最大值
if (intervals[i].start>big) {
big = intervals[i].finally;
A[sum++] = big;
}
if(big>=intervals[n-1].finally){
break;
}
}
}
int cmp(const void *a,const void *b) {
struct Interval *aa,*bb;
aa = (struct Interval *)a;
bb = (struct Interval *)b;
return aa->finally - bb->finally;
}
int main() {
int n,i,j;
printf("请输入区间个数:\n");
scanf("%d",&n);
printf("请输入区间:\n");
for(i=0;i<n;i++) {
scanf("%d %d",&intervals[i].start,&intervals[i].finally);
}
qsort(intervals,n,sizeof(struct Interval),cmp);
GreedySelector(n);
printf("选择的点为:");
for(i=0;i<sum;i++) {
printf("%d ",A[i]);
}
printf("\n");
return 0;
}
三,最大不相交区间:
数轴上有n个开区间(ai,bi)。选择尽量多个区间,使得这些区间两两没有公共点。
/*
author:杨汝生
time:2014-9-12,16:48
algorithm: 贪心法之最大不相交区间问题
*/
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
bool A[100];
struct Interval {
int start;
int finally;
}intervals[100];
void GreedySelector(int n) { //函数处理,选择区间
A[0]=true;
int i,j=0;
for (i=1;i<n;i++) { //尽可能多的选择不想交区间
if (intervals[i].start>=intervals[j].finally) {
A[i]=true;
j=i;
}
else A[i]=false;
}
}
int cmp(const void *a,const void *b) {
struct Interval *aa,*bb;
aa = (struct Interval *)a;
bb = (struct Interval *)b;
return aa->finally - bb->finally;
}
int main() {
int n,i,j;
printf("请输入区间个数:\n");
scanf("%d",&n);
printf("请输入区间:\n");
for(i=0;i<n;i++) {
scanf("%d %d",&intervals[i].start,&intervals[i].finally);
}
qsort(intervals,n,sizeof(struct Interval),cmp);
GreedySelector(n);
for(i=0;i<n;i++) {
if(A[i]==true) {
printf("选择的区间为:");
printf("%d %d ",intervals[i].start,intervals[i].finally);
}
}
printf("\n");
return 0;
}

1010

被折叠的 条评论
为什么被折叠?



