您的位置:首页 > 其它

nyoj 541 第五届河南省程序设计大赛B

2016-05-29 17:24 260 查看

最强DE 战斗力

时间限制:1000 ms  |  内存限制:65535 KB
难度:3

描述
春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业。但许多国家对它虎视眈眈,准备联合起来对赵国发起一场战争。

显然,面对多个国家的部队去作战,赵国的兵力明显处于劣势。战斗力是决定战争成败的关键因素,一般来说,一支部队的战斗力与部队的兵力成正比。但当把一支部队分成若干个作战队伍时,这个部队的战斗力就会大大的增强。

一支部队的战斗力是可以通过以下两个规则计算出来的:

1.若一支作战队伍的兵力为N,则这支作战队伍的战斗力为N;

2.若将一支部队分为若干个作战队伍,则这支部队的总战斗力为这些作战队伍战斗力的乘积。

比如:一支部队的兵力为5时的战斗力分析如下:

情况

作战安排

总的战斗力

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

    显然,将部队分为2个作战队伍(一个为2,另一个为3),总的战斗力达到最大!
输入第一行: N表示有N组测试数据. (2<=N<=5)

接下来有N行,每行有一个整数Ti 代表赵国部队的兵力. (1<=Ti<=1000) i=1,…N
输出对于每一行测试数据,输出占一行,仅一个整数S,表示作战安排的最大战斗力.
样例输入

2
5
4


样例输出

6
4


来源第五届河南省程序设计大赛上传者ACM_李如兵

开始准备用动态规划-.-要大数乘大数-.-不会写了。。。

后来发现一个规律-.-如果n1+n2+n3+......+nk=N;求n1*n2*n3*。。。nk;把他们尽可能的分成3时结果最大-.-(n<=4例外)动态规划代码中比较了前几十项的结果-.-一模一样。。。

利用这个规律就可以转化为计算  大数*3的结果-.-这个我会写


附动态代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int bao[1050],ce[1050];
char shu[1020][1020];
int ge[1020];
void I(int zz,int xx,int yy)
{
ge[1002]=ge[xx];
//	for (int )
}
int main()
{
for (int i=1;i<1001;i++)
bao[i]=i;ce[1]=1;ce[2]=2;ce[3]=3;ce[4]=4;
for (int i=2;i<1001;i++)
{
for (int j=1;j<=i/2;j++)
{
bao[i]=max(bao[i],bao[j]*bao[i-j]);
}
if (i>4) ce[i]=ce[i-3]*3;
if (i<100)
{
printf("%d %d  %d    66\n",i,bao[i],ce[i]);
}

}

int t,n;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
printf("%d\n",bao
);
}
return 0;
}


AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
int sh[31];
int shu[1010][500];
int ge[1010];
void cheng(int xx,int yy)
{
ge[xx]=ge[yy];
for (int i=0;i<ge[xx];i++)
{
shu[xx][i]+=shu[yy][i]*3;
if (shu[xx][i]>9)
{
if (i==ge[xx]-1) ge[xx]++;
shu[xx][i+1]=shu[xx][i]/10;
shu[xx][i]%=10;
}
}
}
int main()
{
sh[1]=1;sh[2]=2;sh[3]=3;sh[4]=4;
for (int i=5;i<31;i++)
sh[i]=sh[i-3]*3;
memset(ge,0,sizeof(ge));
memset(shu,0,sizeof(shu));
ge[28]=ge[29]=ge[30]=5;
shu[28][0]=4;shu[28][1]=4;shu[28][2]=2;shu[28][3]=6;shu[28][4]=2;
shu[29][0]=6;shu[29][1]=6;shu[29][2]=3;shu[29][3]=9;shu[29][4]=3;
shu[30][0]=9;shu[30][1]=4;shu[30][2]=0;shu[30][3]=9;shu[30][4]=5;
for (int i=31;i<1001;i++)
cheng(i,i-3);
int t,n;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
if (n<31)
printf("%d\n",sh
);
else
{
for (int i=ge
-1;i>=0;i--)
printf("%d",shu
[i]);
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: