问题描述:
作为一个比赛队伍总教练的你,请解决下面的问题:
你作为总教练的聘期为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;
}