zoukankan      html  css  js  c++  java
  • 最强DE战斗力

     最强DE战斗力

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 40  解决: 14
    [提交][状态]

    题目描述

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

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

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

    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

    提示

     

    来源

    第五届河南省大学生程序设计竞赛

    要想使乘积最大显然最后肯定是2和3的乘积,于是我用了递归。。1000范围内肯定WA,200就不行了。。于是,大数,怎么大数呢,大数相乘?有点意思,不过你又错了,它从哪来的大数相乘啊。

    前边说了乘的肯定是2或者3,所以就是一个大数乘以一个2或者3,能乘3肯定不乘2,那么问题来了,乘几次?数/3就好了

    CODE:

    #include<stdio.h>
    #include<string.h>

    int sum[205];

    void multify(int n)   // 函数,这个大数乘的是几 (2or3,要是数除3余1的话,乘4,因为乘3再乘1没有乘4大==||
    {
          int i, t = 0;

         for(i = 0; i < 200; i++, t /= 10)
        {
                 t = sum[i] * n + t;  
                sum[i] = t % 10;    // 
        }
    }

    int main()
    {
             int n, t, x, i;

            scanf("%d", &n);

            while(n--)
           {
                  memset(sum, 0, sizeof(sum));
                  sum[0] = 1;

         scanf("%d", &t);

        x = t / 3;  // 需要乘以几次3

        if(t % 3 == 1)   x--;   // 如果是1 ,就少乘一次3,乘一次4

        for(i = 0; i < x; i++)
          multify(3);

        if(t % 3 == 1)   multify(4);  // 乘一次4
        else if(t % 3 == 2)   multify(2);   //如果余2,就多乘以一次2。

        for(i = 200; i >= 0; i--)
          if(sum[i])
            break;   //找 开始的位数

        for(; i >= 0; i--)
          printf("%d", sum[i]);   //按位输出
        printf(" ");
      }
      return 0;
    }

    能不能好好想。

    dissectible ~! Careful Analysis ~! cut it up ~! anatomize ~! scrutiny~!

    (好好读题~题上也有说乘以2或者3最大。。

    让未来到来 让过去过去
  • 相关阅读:
    PHP基础学习笔记(一)
    安装wampserver之后,浏览器中输入localhost页面显示IIS7解决办法
    HTML5常识总结(一)
    AngularJs中的服务
    AngularJs中的directives(指令part1)
    Happy Number——LeetCode
    Binary Tree Zigzag Level Order Traversal——LeetCode
    Construct Binary Tree from Preorder and Inorder Traversal——LeetCode
    Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
    Convert Sorted Array to Binary Search Tree——LeetCode
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4480096.html
Copyright © 2011-2022 走看看