我有一个任务,我遇到了一些麻烦。我有一组数字和一组间隔,我需要决定我需要使用哪些时间间隔来合并我的所有数字。到目前为止,我已经设法获得了包含我的数字的区间,但是当选择1时,效率更高,我真的不知道该怎么做。我有以下代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct{
int min, max;
short int added;
}Pair;
int main(){
FILE *fin, *fout;
fin = fopen("points.in", "r");
if (fin == NULL){
perror("Error");
return 1;
}
int n, m;
int i = 0, j, res;
fscanf(fin, "%d", &n);
fscanf(fin, "%d", &m);
int points[n];
Pair p[m];
while (i != n){
fscanf(fin, "%d", &points[i]);
i++;
}
i = 0;
while (i != m){
fscanf(fin, "%d %d", &p[i].min, &p[i].max);
p[i].added = 0;
i++;
}
Pair swap;
for (i = 0; i < m-1; i++)
for (j = 0; j < m-i-1; j++){
if (p[j].min > p[j+1].min){
swap = p[j];
p[j] = p[j+1];
p[j+1] = swap;
}
}
fout = fopen("points.out", "w");
if (fout == NULL){
perror("Error");
return 1;
}
int k = 0, dist = 0, poz;
j = 0;
i = 0;
while (i < n){
if (points[i] <= p[j].max && points[i] >= p[j].min){
dist = p[j].max - p[j].min;
poz = j;
while(points[i] <= p[j].max && points[i] >= p[j].min){
if ( dist < (p[j].max - p[j].min) ){
dist = p[j].max - p[j].min;
poz = j;
}
j++;
}
}
if (p[poz].added == 0){
p[poz].added = 1;
k++;
}
if (points[i] <= p[poz].max && points[i] >= p[poz].min)
while(points[i] <= p[poz].max && points[i] >= p[poz].min){
i++;
}
else i++;
}
res = k;
fprintf(fout, "%d", res);
fclose(fin);
fclose(fout);
return 0;
}
谁能告诉我,我做错了什么?基本上,我的直觉告诉我,我需要选择一个起始值,找到它适合的间隔,然后遍历可以适合该变量的所有间隔,并为我选择具有最高“值”的那个。我的意思是它可以包含更多的值,例如如果我的值是1,我会选择[1,6]而不是[0,1] .1在两个区间都是1但是我有更多机会[1,6]。