比赛 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;
}