最强DE 战斗力
时间限制:1000 ms | 内存限制:65535 KB
难度:3
-
描述
-
春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业。但许多国家对它虎视眈眈,准备联合起来对赵国发起一场战争。
显然,面对多个国家的部队去作战,赵国的兵力明显处于劣势。战斗力是决定战争成败的关键因素,一般来说,一支部队的战斗力与部队的兵力成正比。但当把一支部队分成若干个作战队伍时,这个部队的战斗力就会大大的增强。
一支部队的战斗力是可以通过以下两个规则计算出来的:
1.若一支作战队伍的兵力为N,则这支作战队伍的战斗力为N;
2.若将一支部队分为若干个作战队伍,则这支部队的总战斗力为这些作战队伍战斗力的乘积。
比如:一支部队的兵力为5时的战斗力分析如下:
显然,将部队分为2个作战队伍(一个为2,另一个为3),总的战斗力达到最大!情况
作战安排
总的战斗力
1
1,1,1,1,1(共分为5个作战队伍)
1*1*1*1*1=1
2
1,1,1,2 (共分为4个作战队伍)
1*1*1*2=2
3
1,2,2 (共分为3个作战队伍)
1*2*2=4
4
1,1,3 (共分为3个作战队伍)
1*1*3=3
5
2,3 (共分为2个作战队伍)
2*3=6
6
1,4 (共分为2个作战队伍)
1*4=4
7
5 (共分为1个作战队伍)
5=5
-
输入
-
第一行: N表示有N组测试数据. (2<=N<=5)
接下来有N行,每行有一个整数Ti 代表赵国部队的兵力. (1<=Ti<=1000) i=1,…N
输出
- 对于每一行测试数据,输出占一行,仅一个整数S,表示作战安排的最大战斗力. 样例输入
-
2
5
4
样例输出
-
6
4
题目分析:其实找到规律后发现,将N分成尽量多的3,当最后剩的是1的话,则与一个3凑成4.这样值更大些。
就是感觉自己编程能力太差了哈!
下面贴一下优秀代码#include <iostream> using std::cout; using std::cin; using std::endl; //x数组存放的是运算的结果,count表示乘以3的次数,number 表示数组要乘以的数值,位数表示当前存放结果数组的位数 int maxnumber(int x[] , int count, int number, int weishu) { //jinwei表示每次乘法后低位向高位的进位 int jinwei=0; while(count--) { //下面便是大数运算用数组模拟的代码 for(int i=1; i<=weishu; ++i) { int temp; temp = x[i-1]*number+jinwei; x[i-1] = temp%10; jinwei = temp/10; } //当进位不是0的时候,说明还要向高位进位,这时位数要增加 while(jinwei) { weishu++; x[weishu-1] = jinwei%10; jinwei = jinwei/10; } } return weishu; } int main() { int K; cin >> K; while(K--) { //因为最后的结果是大数,所以涉及到大数运算,用数组模拟大数乘法,将最后的结果存放到数组中 int data[170] = {1}; int weishu; int N; cin >> N; int cnt = 0; if(N < 3) { cout << N; }else{ while(N >= 3) { N = N -3; cnt ++; } if(N == 0) { weishu = maxnumber(data , cnt , 3 , 1); }else if(N == 1) { int bit = maxnumber(data , cnt-1 , 3 , 1); weishu = maxnumber(data , 1, 4 , bit); }else{ int bit = maxnumber(data , cnt , 3, 1); weishu = maxnumber(data , 1 , 2 , bit); } } //因为数组的低位是数字的最右边,所以应该反着输出 for(int i=weishu-1; i>=0; --i) { cout << data[i]; } cout << endl; } system("pause"); return 0; }
#include <stdio.h> #include <string.h> #define base 10000 int ans[1000]; void mul(int x) { int k = ans[0]; for(int i=1;i<=k;i++) ans[i] *= x; for(int i=1;i<=k;i++) { if(ans[i]>=base) { ans[i+1] += ans[i]/base; ans[i] %= base; } } if(ans[k+1]) ans[0]++; } void print() { int k = ans[0]; printf("%d",ans[k]); for(int i=k-1;i>=1;i--) printf("%04d",ans[i]); printf("\n"); } int main() { int z,n; scanf("%d",&z); while(z--) { scanf("%d",&n); memset(ans,0,sizeof(ans)); ans[0] = ans[1] = 1; while(n >= 3) { if(n == 4) { mul(4); break; } if(n == 5) { mul(6); break; } mul(3); n -= 3; } if(n == 2) mul(2); print(); } return 0; }
-
第一行: N表示有N组测试数据. (2<=N<=5)