如何确定哪个区间最合适?

时间:2017-04-13 13:52:18

标签: 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("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]。

0 个答案:

没有答案