dp或者贪心怎么做这题求不重合的区间个数
  • 板块题目总版
  • 楼主Utopia_H
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/4/30 11:42
  • 上次更新2023/10/23 17:10:23
查看原帖
dp或者贪心怎么做这题求不重合的区间个数
919699
Utopia_H楼主2023/4/30 11:42

题目

大意是回答问题 我们假设现在的时间点是0分,在n的时间内有m个小伙伴会来问问题,每到x分钟的时候会有一个小伙伴来问问题,解决这个小伙伴的问题需要y分钟。

要尽可能多的小伙伴解决问题,又不想让小伙伴出现等待时长,现在问他在n分钟内最多能帮多少小伙伴解决问题, 且又不会让每位小伙伴出现等待时长。

解决完一个问题就能马上开始帮下一个小伙伴解决,例如第一个小伙伴在第一分钟来,然后需要1分钟解决,第二个小伙伴在第二分钟来,那么他解决完第一个小伙伴的问题马上就可以开始帮第二个小伙伴解决问题。

另外如果小伙伴是第n-1分钟来的,然后解决问题需要2分钟,那么会帮他解决这个问题

输入格式: 第一行两个数n,m.(1<=n,m<=1000)

然后m行每行2个数x,y(1<=x,y<=n)。

输出格式: 一个数ans,表示能帮多少小伙伴解决问题。

输入样例1: 在这里给出一组输入。
3 2
1 1
2 1

输出样例1:
2
输入样例2:
2 2
1 1
2 1
输出样例2:
1

自己写的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define N 1010

void swap(int* a, int* b)
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
}

void px(int a[], int b[], int end[], int m)
{
    int min, i, j;
    for(i=1;i<m;i++)
    {
        min = i;
        for(j=i+1;j<=m;j++)
        {
            if(end[min]>end[j])
            {
                min = j;
            }
            else if(end[min] == end[j])
            {
                if(a[min]<a[j])
                {
                    min = j;
                }
            }
        }
        swap(&a[i], &a[min]);
        swap(&b[i], &b[min]);
        swap(&end[i], &end[min]);
    }
}

int main()
{
    int n, m;
    int x[N],y[N], end[N];
    int i;
    int cnt=0, nowt = 0;
    scanf("%d %d", &n, &m);
    for(i=1;i<=m;i++)
    {
        scanf("%d %d", &x[i], &y[i]);
        end[i] = x[i] + y[i];
    }
    px(x, y, end, m);
    for(i=1;i<=m;i++)
    {
        if(end[i]>n)
            break;
        else
        {
            if(x[i]>=nowt)
            {
                cnt++;
            }
            nowt = end[i];
        }
    }
    printf("%d",cnt);
    return 0;
}
2023/4/30 11:42
加载中...