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 */