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 |
输入第一行: 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的结果-.-这个我会写
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/titter.gif)
附动态代码
#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; }
相关文章推荐
- flex布局中align-items 和align-content的区别
- 单例模式
- Unity3D 性能优化
- WebService入门
- kobject的容器kset与hotplug
- hdu_3709_Balanced Number(数位DP)
- hdu_3709_Balanced Number(数位DP)
- alert() 与 console.log() 的区别
- 二叉树的简单递归实现(创建,遍历,高度,大小)
- 二叉树的非递归遍历
- Linux中常用的查询指令(which、whereis、find、locatae)
- 如何将你的vim配置的“高大上”
- ctags 和Makefile的简单使用
- 学习进度第十三周
- Unity性能优化(CPU)
- TOJ 4146 4147 4148 4149 4150 4151 4152 4153 4154
- 2016百度之星复赛 1003 拍照 扫描线
- 编写一个函数reverse_string(char * string)(递归实现)
- 二叉树的简单操作
- 模拟实现常用字符串函数