比赛描述
牧师作为炉石传说中典型的后期职业,有许多神奇的法术牌,比如“心灵之火”:使一个随从的攻击力等于其生命值;“神圣之灵”:使一个随从的生命值翻倍。每施放一次心灵之火需要花费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'); } } }