【算法分析与设计】少打比赛多训练

问题描述:
作为一个比赛队伍总教练的你,请解决下面的问题:
你作为总教练的聘期为n天。
在这n天里,一共有n个比赛可以参加。
队员们都愿意参加比赛,而不愿意训练,所以希望有比赛就参加。
如果在某一天有多场比赛同时开始,作为主教练的你可任选其中一场比赛参加(前提是队伍没有正在参加的比赛)。
比赛从第s天开始,持续t天,则该比赛在第 s+t-1 天结束。
作为总教练的你,应该如何选择比赛,才能既使得队员满意(有比赛就参加),又能尽可能延长训练的时间,减少参加比赛的时间。
编程任务:
对于给定的比赛时间表,编程计算最少的比赛天数。
数据输入:
第 1 行有 2 个正整数 n 和 k。n 表示总天数;k 是比赛个数。接下来的 k 行中,每行有 2 个表示比赛的整数 s 和 t,该比赛从第 s 天开始,持续 t 天。 0 < n, k < 10000
样例输入:
15 6 1 2 1 6 4 11 8 5 8 1 11 5
代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll dp[100002],n,m,s[100002]={0};
map<ll,int>T;
struct node
{
    ll u;ll t;
}
a[100002];
int main()
{
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        scanf("%lld%lld",&a[i].u,&a[i].t);
        T[a[i].u*100000+(s[a[i].u]++)]=a[i].t;//记录以a[i].u开始的每一个维持时间
    }
    memset(dp,0x3f,sizeof(dp));
    dp[n+1]=0;
    for(int i=n;i>=1;i--)
    {
        if(s[i]==0)
        {
            dp[i]=dp[i+1];
        }
        else
        {
            for(int j=0;j<s[i];j++)
            dp[i]=min(dp[i+T[i*100000+j]]+T[i*100000+j],dp[i]);
        }
    }
    cout<<dp[1]<<endl;
    return 0;
}

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Walker_CodeGou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值