C 如何决定哪种间隔最适合?

C 如何决定哪种间隔最适合?,c,algorithm,logic,dynamic-programming,greedy,C,Algorithm,Logic,Dynamic Programming,Greedy,我有个任务,有点麻烦。我有一组数字和一组区间,我需要决定我需要使用哪些区间来合并我的所有数字。到目前为止还不错,我已经成功地获得了包含我的数字的区间,但是当选择1时,我真的不知道怎么做。我有以下代码: #include <stdio.h> #include <stdlib.h> typedef struct{ int min, max; short int added; }Pair; int main(){ FILE *fin, *fout; fin = fopen

我有个任务,有点麻烦。我有一组数字和一组区间,我需要决定我需要使用哪些区间来合并我的所有数字。到目前为止还不错,我已经成功地获得了包含我的数字的区间,但是当选择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;
}
#包括
#包括
类型定义结构{
最小整数,最大整数;
增加了短int;
}配对;
int main(){
文件*fin,*fout;
fin=fopen(“点英寸”、“r”);
如果(fin==NULL){
佩罗(“错误”);
返回1;
}
int n,m;
int i=0,j,res;
fscanf(fin、%d、&n);
fscanf(fin、%d、&m);
整数点[n];
对p[m];
而(i!=n){
fscanf(fin、%d、&points[i]);
i++;
}
i=0;
而(i!=m){
fscanf(fin,“%d%d”,&p[i].min,&p[i].max);
p[i].added=0;
i++;
}
对交换;
对于(i=0;ip[j+1].min){
swap=p[j];
p[j]=p[j+1];
p[j+1]=互换;
}
}
fout=fopen(“指出”、“w”);
如果(fout==NULL){
佩罗(“错误”);
返回1;
}
int k=0,dist=0,poz;
j=0;
i=0;
而(i

谁能告诉我哪里做错了?基本上,我的直觉告诉我,我需要选择一个起始值,找到它适合的区间,然后迭代所有适合该变量的区间,然后选择对我来说“值”最高的区间。我的意思是,它可以包含更多的值,例如,如果我的值为1,我将选择[1,6]而不是[0,1]。1在两个区间都是,但我有更多机会使用[1,6]

我的代码是用C编写的,我认为需要添加标记。如果我犯了错误,我很抱歉。我比较新。@AjayBrahmakshatriya这是C代码。C标签是合适的。当然,你有所有必要的代码来制作一个简单的小型可编译程序来演示你的问题。帮助他人的帖子帮助你。建议添加该代码以获得更多有用的答案和评论-除非你的目标是让其他人难堪?一个关键的逻辑弱点是按小
sol[j].max-sol[j].min
逐点评分“最佳”。我怀疑代码还需要跟踪到目前为止发现的最小和最大
点[I]
。如果只需要1个时间间隔,为什么不使用
点[]
的最小/最大值,并找到容纳这两个点的“最小”时间间隔?我添加了整个代码,以便易于理解。我遇到的问题是,我没有得到所需的所有时间间隔。我被问到的是:给定N个数字和m个区间,找出包含所有N个数字的最小区间数