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

最强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
#include
#include
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[n]);
	}
	return 0;
}


AC代码:

#include
#include
#include
int sh[31];
int shu[1010][500];
int ge[1010];
void cheng(int xx,int yy)
{
	ge[xx]=ge[yy];
	for (int i=0;i9)
		{
			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[n]);
		else
		{
			for (int i=ge[n]-1;i>=0;i--)
			printf("%d",shu[n][i]);
			printf("\n");
		}
	}
	return 0;
}


你可能感兴趣的:(省赛,南阳oj,动态规划)