间隔时间表问题有关从每个间隔选择相同时间长度的问题

Interval schedule question about choose the same length of time from each interval

本文关键字:问题 同时间 选择 时间表      更新时间:2023-10-16

我在间隔时间表问题上挣扎,问题描述如下:

描述:Lanran有n个朋友。每个星期日,兰兰都必须玩 和他的朋友。第三朋友可以从时间A到Lanran玩 时间B(包括A和B)。但是,Lanran必须与每个 他的朋友的时间相同。兰兰想和 他的朋友尽可能长。但是他很愚蠢。所以他要求 您的帮助来计算他可以玩的最大时间 朋友。

输入第一行包含一个整数n。下一个n(n< = 5000)线包含两个整数A和B(1< = a,b< = 10000),它们 显示第三朋友的时间间隔。

输出输出一个整数,显示Lanran可以播放的最大时间 和他的每个朋友一起。

我认为这是一个贪婪的问题,我选择了最少的时间朋友,这是已经玩过的时间 可能的上场时间,直到b的朋友,然后在第三秒与他一起玩。这是代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 5010;
int n, s[N], e[N], cnt[N], me;
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
int partition(int low, int high) {
    int pivot = s[high];
    int i = (low - 1);
    for (int j = low; j <= high - 1; j++) {
        if (s[j] <= pivot) {
            i++;
            swap(&s[i], &s[j]);
            swap(&e[i], &e[j]);
        }
    }
    swap(&s[i + 1], &s[high]);
    swap(&e[i + 1], &e[high]);
    return (i + 1);
}
void quickSort(int low, int high) {
    if (low < high) {
        int pi = partition(low, high);
        quickSort(low, pi - 1);
        quickSort(pi + 1, high);
    }
}
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; ++i) {
        scanf("%d%d", &s[i], &e[i]);
        if (e[i] < s[i]) { printf("0n"); return 0; }
        if (e[i] > me) me = e[i];
    }
    quickSort(0, n - 1);
    for (int i = 1; i <= me; ++i) {
        int id = -1, mi = 0x7fffffff;
        for (int j = 0; j < n; ++j) {
            if (s[j] > i || i > e[j]) continue;
            if (cnt[j] + e[j] - i + 1 < mi) { id = j; mi = cnt[j] + e[j] - i + 1; }
        }
        ++cnt[id];
    }
    int ans = 0x7fffffff;
    for (int i = 0; i < n; ++i) if (cnt[i] < ans) ans = cnt[i];
    printf("%dn", ans);
    return 0;
}

所以我会错吗?我在10个测试用例中得到了7个错误的答案。

看起来与标准活动选择问题相同。我粘贴了相关的标准算法。您可以找到Wiki:https://en.wikipedia.org/wiki/activitive_selection_problem。贪婪的词Activity-Selector(a,s,f):

Sort A by finish times stored in f
S = {A[1]} 
k = 1
n = A.length
for i = 2 to n:
   if s[i] ≥ f[k]: 
       S = S U {A[i]}
       k = i
return S