南邮 OJ 1970 牧师

牧师

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

比赛描述

牧师作为炉石传说中典型的后期职业,有许多神奇的法术牌,比如心灵之火:使一个随从的攻击力等于其生命值;神圣之灵:使一个随从的生命值翻倍。每施放一次心灵之火需要花费1点法力值,施放神圣之灵则需要2点。现在你的场上有一个随从,你最多可以让它拥有多少攻击力呢?




输入

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

每组数据第一行有3个整数:n,a,b分别表示拥有的法力值以及有多少张心灵之火和神圣之灵0<=n<=1000,0<=a<=1000,0<=b<=1000。

第二行为两个整数x,y表示随从的攻击力和生命值0<=x<=1000,0<y<=1000.


输出

一个整数表示最大可能的攻击力值。


样例输入

2
2 1 1
3 2
3 1 1
3 2

样例输出

3
4

题目来源

LYD





/* Wrong Answer at Test 1
#include<iostream>

int main(){
	__int64 t,n,a,b,x,y;
	scanf("%I64d",&t);
	while(t--){
		scanf("%I64d%I64d%I64d%I64d%I64d",&n,&a,&b,&x,&y);
		while(b && n>=3){
			b--;
			n -= 2;
			y <<= 1;
		}
		if(n>=1 && a && x<y){
			x = y;
		}
		printf("%I64d\n",x);
	}
}
*/



/*
#include<iostream>

#define MAX_N 1005
char a[MAX_N],b[MAX_N];
int lenA,lenB;

// 返回十进制数的位数
int numToArray(char *a, int n){
	int i=0;
	while(n){
		a[i] = n%10;
		n /= 10;
		i++;
	}
	return i;
}

void mul(char *a, int n, int &len){
	int i;
	for(i=0;i<len;i++){
		a[i] *= n;
		a[i+1] += a[i]/10;
		a[i] %= 10;
	}
	while(a[len]){
		a[len+1] += a[len]/10;
		a[len] %= 10;
		len++;
	}
}

bool smallerThan(char *a, int lenA, char *b, int lenB){
	if(lenA != lenB){
		return lenA<lenB;
	}
	for(int i=lenA-1;i>=0;i--){
		if(a[i] != b[i]){
			return a[i]<b[i];
		}
	}
	return 0;
}

void printNum(char *a, int len){
	len--;
	while(len>=0){
		putchar(a[len]+'0');
		len--;
	}
}

int main(){
//	freopen("test.txt","r",stdin);
	int t,n,aa,bb,x,y;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d%d%d",&n,&aa,&bb,&x,&y);
		lenA = numToArray(a,x);
		lenB = numToArray(b,y);
		while(bb && n>=3){
			bb--;
			n -= 2;
			mul(b,2,lenB);
		}
		if(n && a && smallerThan(a,lenA,b,lenB)){
			printNum(b,lenB);
			putchar('\n');
		}else{
			printNum(a,lenA);
			putchar('\n');
		}
	}
}
*/


#include<iostream>

#define MAX_N 1005
char a[MAX_N],b[MAX_N];
int lenA,lenB;

// 返回十进制数的位数
int numToArray(char *a, int n){
	int i=0;
	while(n){
		a[i] = n%10;
		n /= 10;
		i++;
	}
	return i;
}

void mul(char *a, int n, int &len){
	int i;
	for(i=0;i<len;i++){
		a[i] *= n;
	}
	for(i=0;i<len;i++){
		a[i+1] += a[i]/10;
		a[i] %= 10;
	}
	while(a[len]){
		a[len+1] = a[len]/10;
		a[len] %= 10;
		len++;
	}
}

bool smallerThan(char *a, int lenA, char *b, int lenB){
	if(lenA != lenB){
		return lenA<lenB;
	}
	for(int i=lenA-1;i>=0;i--){
		if(a[i] != b[i]){
			return a[i]<b[i];
		}
	}
	return 0;
}

void printNum(char *a, int len){
	len--;
	while(len>=0){
		putchar(a[len]+'0');
		len--;
	}
}

int main(){
//	freopen("test.txt","r",stdin);
	int t,n,aa,bb,x,y;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d%d%d",&n,&aa,&bb,&x,&y);
		memset(a, 0, sizeof(a));
		memset(b, 0, sizeof(b));
		lenA = numToArray(a,x);
		lenB = numToArray(b,y);
		while(bb && n>=3){
			bb--;
			n -= 2;
			mul(b,2,lenB);
		}
		if(n && aa && smallerThan(a,lenA,b,lenB)){	// aa错写成a一直WA,所以名字最好不要取得这么类似……
			printNum(b,lenB);
			putchar('\n');
		}else{
			printNum(a,lenA);
			putchar('\n');
		}
	}
}


你可能感兴趣的:(ACM,牧师,南邮OJ)