南邮 OJ 2084 送花

送花

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 216            测试通过 : 73 

比赛描述

萌妹纸一般都比较喜欢漂亮的鲜花。每逢各种节日,她们都想收到鲜花作为礼物。如果你是有妹纸滴人,经常不送妹纸花的话,结果可想而知了。

当然咯,妹纸都是通情达理的,不会因为某几次你木有送花,就发你好人卡了。王童鞋作为一个比较节俭(抠门)的人便知道这一道理,因此他想在妹纸不给他发好人卡的前提下,送尽量少的花。

为了简单起见,我们定义一个妹纸的幸福指数H(初始为)。如果某天幸福指数H小于0,那就。。。

如果某天妹纸收到了花,幸福指数H会增加ai,如果没收到,会下降bi。不同的日子送花对幸福指数的增加可能会有所不同,比如在214号送花就会比215号效果好~

即告诉你总天数n(1<=n<=365),每天收到花幸福指数的增加值ai(1<=ai<=10),没收到花幸福指数的降低值bi,求为了让妹纸的幸福指数H一直>=0,王童鞋至少要送妹纸多少朵花。



输入

第一行为一个正整数T,表示有T组数据。

每组数据第一行有1个整数: n表示总天数1<=n<=365

第二行为n个整数ai表示第i天收到花幸福指数的增加值,1<=ai<=10第三行为n个整数bi表示第i天没收到花幸福指数的下降值,1<=bi<=10

输出

一个整数表示最少需要送多少朵花。

样例输入

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

样例输出

1
2

题目来源

njczy2010






//93MS  menset()给不需要赋值的dp[i][j]赋值了所以花费了更多的时间
//dp[i][j] : 第 i 天,幸福值达到 j 所需要的最少花的数量

#include<iostream>
using namespace std;
#define MAX_DAY 366
#define MAX_HAPPY 10

int n,maxHappy;
int a[MAX_DAY];
int b[MAX_DAY];
int dp[MAX_DAY][MAX_DAY*MAX_HAPPY];

void init(){
	int i,j;
	maxHappy = 0;
	scanf("%d",&n);
	for(i=1; i<=n; i++){
		scanf("%d",a+i);
		maxHappy += a[i];
	}
	for(i=1; i<=n; i++){
		scanf("%d",b+i);
	}
	for(i=0; i<=n; i++){
		for(j=0;j<=maxHappy;j++){
			dp[i][j]=MAX_DAY;
		}
	}
	dp[0][0] = 0;
}

void handle(){
	int i,j,temp;
	for(i=1;i<=n;i++){
		for(j=0;j+a[i]<=maxHappy;j++){
			temp = j+a[i];
			if(dp[i][temp] > dp[i-1][j]+1){
				dp[i][temp] = dp[i-1][j]+1;
			}
		}
		for(j=b[i];j<=maxHappy;j++){
			temp = j-b[i];
			if(dp[i][temp] > dp[i-1][j]){
				dp[i][temp] = dp[i-1][j];
			}
		}
	}
}

void printResult(){
	int minVal = INT_MAX,j;
	for(j=0;j<=maxHappy;j++){
		if(dp[n][j]!=-1 && minVal>dp[n][j]){
			minVal = dp[n][j];
		}
	}
	printf("%d\n",minVal);
}

int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		init();
		handle();
		printResult();
	}
}












/*132MS
//dp[i][j] : 第 i 天,幸福值达到 j 所需要的最少花的数量

#include<iostream>
using namespace std;
#define MAX_DAY 366
#define MAX_HAPPY 10

int n,maxHappy;
int a[MAX_DAY];
int b[MAX_DAY];
int dp[MAX_DAY][MAX_DAY*MAX_HAPPY];

void init(){
	int i;
	maxHappy = 0;
	scanf("%d",&n);
	for(i=1; i<=n; i++){
		scanf("%d",a+i);
		maxHappy += a[i];
	}
	for(i=1; i<=n; i++){
		scanf("%d",b+i);
	}
	memset(dp,-1,sizeof(dp));			//每个byte是-1的话,则看做int还是-1
	dp[0][0] = 0;
}

void handle(){
	int i,j,temp;
	for(i=1;i<=n;i++){
		for(j=0;j+a[i]<=maxHappy;j++){
			if(-1==dp[i-1][j]){
				continue;
			}
			temp = j+a[i];
			if(-1==dp[i][temp] || dp[i][temp] > dp[i-1][j]+1){
				dp[i][temp] = dp[i-1][j]+1;
			}
		}
		for(j=b[i];j<=maxHappy;j++){
			if(-1==dp[i-1][j]){
				continue;
			}
			temp = j-b[i];
			if(-1==dp[i][temp] || dp[i][temp] > dp[i-1][j]){
				dp[i][temp] = dp[i-1][j];
			}
		}
	}
}

void printResult(){
	int minVal = INT_MAX,j;
	for(j=0;j<=maxHappy;j++){
		if(dp[n][j]!=-1 && minVal>dp[n][j]){
			minVal = dp[n][j];
		}
	}
	printf("%d\n",minVal);
}

int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		init();
		handle();
		printResult();
	}
}
*/


你可能感兴趣的:(ACM,送花,南邮OJ)