1606:【 例 1】任务安排 1

时间限制: 1000 ms         内存限制: 524288 KB

【题目描述】

有 S 加上每个任务所需时间之和。

一个任务执行后,将在机器中稍作等待,直至该批任务全部执行完毕。也就是说,同一批任务将在同一时刻完成。每个任务的费用是它的完成时刻乘以一个费用系数 Ci 。

请为机器规划一个分组方案,使得总费用最小。

【输入】

第一行是 

下面 Ci 。

【输出】

一个数,最小的总费用。

【输入样例】

5
1
1 3
3 2
4 3
2 3
1 4

【输出样例】

153

【提示】

样例说明:

分组方案为3。

数据范围与提示:

对于全部数据,

 

sol:n3 应该很简单,dp[i][j]表示到第i个任务,分了几段(因为时间是有后效性的,处理起来很蛋疼

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline ll read()
{
    ll s=0;
    bool f=0;
    char ch=' ';
    while(!isdigit(ch))
    {
        f|=(ch=='-'); ch=getchar();
    }
    while(isdigit(ch))
    {
        s=(s<<3)+(s<<1)+(ch^48); ch=getchar();
    }
    return (f)?(-s):(s);
}
#define R(x) x=read()
inline void write(ll x)
{
    if(x<0)
    {
        putchar('-'); x=-x;
    }
    if(x<10)
    {
        putchar(x+'0');    return;
    }
    write(x/10);
    putchar((x%10)+'0');
    return;
}
#define W(x) write(x),putchar(' ')
#define Wl(x) write(x),putchar('\n')
const int N=5005;
const ll inf=0x7fffffffff;
int n,S;
int Time[N],Cost[N],Time_Qzh[N],Cost_Qzh[N];
ll dp[N][N];
int main()
{
    int i,j,k;
    R(n); R(S);
    for(i=1;i<=n;i++)
    {
        Time_Qzh[i]=Time_Qzh[i-1]+(Time[i]=read());
        Cost_Qzh[i]=Cost_Qzh[i-1]+(Cost[i]=read());
    }
    memset(dp,63,sizeof dp);
    dp[0][0]=0;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=i;j++)
        {
            for(k=j-1;k<=i-1;k++)
            {
                dp[i][j]=min(dp[i][j],dp[k][j-1]+1ll*(Time_Qzh[i]+S*j)*(Cost_Qzh[i]-Cost_Qzh[k]));
            }
        }
    }
    ll ans=inf;
    for(i=1;i<=n;i++) ans=min(ans,dp[n][i]);
    Wl(ans);
    return 0;
}
/*
input
5
1
1 3
3 2
4 3
2 3
1 4
output
153
*/
n^3做法

相关文章: