比赛 |
20090916练习赛 |
评测结果 |
AAAAAAWTTT |
题目名称 |
任务安排 |
最终得分 |
60 |
用户昵称 |
cstdio |
运行时间 |
3.935 s |
代码语言 |
C++ |
内存使用 |
98.59 MiB |
提交时间 |
2013-11-07 21:06:29 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int SIZEN=5001;
const int INF=0x7ffffff;
int N,S;
int TS[SIZEN]={0},FS[SIZEN]={0};//时间和费用系数的前缀和
int f[SIZEN][SIZEN]={0};//f[j][i]表示分j批完成,前i个,显然i,j的范围都是1~N
int calc(int j,int i,int k){//当前计算打j包,第i个,由k转移的耗时
if(k<j-1||k>=i) return INF;
return (FS[i]-FS[k])*(TS[i]+S*j)+f[j-1][k];
}
/*int find(int j,int i,int left,int right){
if(left==right) return left;
int mid=(left+right)>>1;
int vl,vm,vr;
vl=calc(j,i,left),vr=calc(j,i,right),vm=calc(j,i,mid);
if(vm<)
}*/
int mincost(int j,int i){//打j包,第i个
int k;
int ans=INF;
for(k=j-1;k<i;k++) ans=min(ans,calc(j,i,k));
return ans;
}
void DP(void){
int i,j;
for(i=0;i<=N;i++) for(j=0;j<=N;j++) f[j][i]=INF;
for(i=0;i<=N;i++) f[1][i]=(S+TS[i])*FS[i];
for(j=2;j<=N;j++){
for(i=j;i<=N;i++){
f[j][i]=mincost(j,i);
}
}
}
void answer(void){
int ans=INF;
int i;
for(i=1;i<=N;i++) ans=min(ans,f[i][N]);
printf("%d\n",ans);
}
void read(void){
scanf("%d%d",&N,&S);
int i;
for(i=1;i<=N;i++){
scanf("%d%d",&TS[i],&FS[i]);
TS[i]+=TS[i-1],FS[i]+=FS[i-1];
}
}
int main(){
freopen("batch.in","r",stdin);
freopen("batch.out","w",stdout);
read();
DP();
answer();
/*int i,j;
for(j=1;j<=N;j++){
for(i=1;i<=N;i++) cout<<f[j][i]<<" ";
cout<<endl;
}*/
return 0;
}