记录编号 98490 评测结果 AAAAAAAAAA
题目名称 电子书狂热者 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 1.777 s
提交时间 2014-04-23 14:28:00 内存使用 0.59 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
typedef long long ll;
const int SIZEN=2010,SIZES=20010;
const ll INF=1e18;
int N;
ll booknum[SIZEN];
ll readsum[SIZEN];
ll price[SIZEN];
int n2;//第一种套餐
ll A[SIZEN],R[SIZEN];
//连续A[i]本交R[i]
ll booksum;//读书总数
ll conw[SIZES]={0};
int n3;//第二种套餐
ll B[SIZEN],S[SIZEN];
//连续B[i]天交S[i]
ll f[SIZEN];
void preDP(void){
	for(int i=0;i<=booksum;i++) conw[i]=INF;
	conw[0]=0;
	for(int i=1;i<=n2;i++){
		//这个套餐:连续A[i]本交R[i]
		for(int j=A[i];j>=0;j--) conw[j]=min(conw[j],R[i]);
	}
	for(int i=1;i<=booksum;i++){
		for(int j=1;j*2<=i;j++){
			conw[i]=min(conw[i],conw[j]+conw[i-j]);
		}
	}
}
void work(void){
	f[0]=0;
	for(int i=1;i<=N;i++){
		f[i]=f[i-1]+booknum[i]*price[i];
		for(int j=0;j<i;j++) f[i]=min(f[i],f[j]+conw[readsum[i]-readsum[j]]);//最后用了若干次第一种套餐,j是上一个"完整的天"
		for(int j=1;j<=n3;j++){
			int temp=(i-B[j]>=0)?i-B[j]:0;
			f[i]=min(f[i],f[temp]+S[j]);//最后用了第二种套餐,j是用的套餐编号
		}
		//这个套餐是连续B[j]天交S[j]
	}
	printf("%lld\n",f[N]);
}
void setzero(ll s[SIZEN]){
	for(int i=0;i<SIZEN;i++) s[i]=0;
}
bool read(void){
	scanf("%d",&N);
	if(!N) return false;
	setzero(booknum);
	setzero(readsum);
	setzero(price);
	setzero(A);
	setzero(R);
	setzero(conw);
	for(int i=0;i<SIZES;i++) conw[i]=0;
	setzero(B);
	setzero(S);
	setzero(f);
	booksum=0;
	readsum[0]=0;
	for(int i=1;i<=N;i++){
		cin>>booknum[i];
		booksum+=booknum[i],readsum[i]=readsum[i-1]+booknum[i];
	}
	int n1;
	scanf("%d",&n1);
	int last=0,c;
	ll p;
	for(int i=1;i<=n1;i++){
		cin>>c>>p;
		for(int j=last;j<c;j++) price[j]=price[last];
		price[c]=p;
		last=c;
	}
	for(int j=last;j<=N;j++) price[j]=price[last];
	scanf("%d",&n2);
	for(int i=1;i<=n2;i++) scanf("%lld%lld",&A[i],&R[i]);
	scanf("%d",&n3);
	for(int i=1;i<=n3;i++) scanf("%lld%lld",&B[i],&S[i]);
	return true;
}
int main(){
	freopen("zealot.in","r",stdin);
	freopen("zealot.out","w",stdout);
	while(read()){
		preDP();
		work();
	}
	return 0;
}