zoukankan      html  css  js  c++  java
  • 南阳OJ 1170 最大的数

    最大的数

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
    小明和小红在打赌说自己数学学的好,于是小花就给他们出题了,考考他们谁NB,题目是这样的给你N个数
    在这n个数之间添加N-1个*或+,使结果最大,但不可以打乱原顺序,请得出这个结果
    1 3 5
    结果是(1+3)*5=20;最大
    可以添加若干个括号,但一定要保证配对,但是每两个数之间只可能有一个*或+
    数列最前和最后不应有+或乘
    小明想赢小红但是他比较笨,请你帮帮他
     
    输入
    多组测试数据以EOF结束,每组有一个n(n<10000),然后有n个正整数a[i](1<=a[i]<=20)
    输出
    输出最大的结果由于结果比较大,结果对10086取余
    样例输入
    3
    1 2 3
    3
    5 1 2
    样例输出
    9
    15

    题目解析:

      本道题其实就是就是找 1,并分情况处理 1,考虑将其加到它的前边某个数上或它的下一个数上。

    示例代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 using namespace std;
     4 
     5 #define MAX_NUM 10001
     6 
     7 int num[MAX_NUM];     //保存输入的数 
     8 int mark[MAX_NUM];    //标记,当不需要计算时,置-1 
     9 
    10 int main()
    11 {
    12     int n;
    13     while (scanf("%d", &n) != EOF)
    14     {
    15         for (int i = 0; i < n; i++)
    16             scanf("%d", &num[i]);
    17         memset(mark, 0, sizeof(num));
    18         
    19         if (num[0] == 1)      //如果第一个数为1 
    20         {
    21             num[1] += 1;      //则将它加到第二个数上 
    22             mark[0] = -1;     //将标记置-1,计算时就不需要算它 
    23         }
    24         if (num[n-1] == 1)    //如果最后一个数为1 
    25         {
    26             num[n-2] += 1;    //那么将它加到倒数倒数第二个数上 
    27             mark[n-1] = -1;
    28         }
    29         
    30         int tmp;
    31         for (int i = 1;i < n-1; i++)    //中间的数 
    32         {
    33             if (num[i] == 1)      //如果找到第i个数为1 
    34             {
    35                 mark[i] = -1;     //先将标记置-1 
    36                 tmp = i-1;        //先准备将它加到它前一个数上 
    37                 
    38                 while(mark[tmp] == -1) {    //如果它的前一个为1,且已经处理过了 
    39                     tmp--;                    //那么继续往前找 
    40                 }
    41                 
    42                 if (num[tmp] <= num[i+1] || num[tmp] == 2)    //利用贪心思想考虑将这个1加到它的前边还是后边 
    43                     //(1)如果找到它的前边那个不为1的数,且小于等于它的下一个数 或 
    44                     //(2)它的前边那个不为1的数为2,则加到前边那个不为1的数上边
    45                     num[tmp]++;
    46                 else//否则加到它的下一个数上 
    47                     num[i+1]++;
    48             }
    49         }
    50         
    51         int ans = 1;
    52         for (int i = 0; i < n; i++)
    53         {
    54             if (mark[i] != -1)    //将标记数组中不为-1的数相乘即为最大的数 
    55                ans = ans * (num[i]) % 10086;
    56         }
    57         printf("%d
    ", ans);
    58     }
    59     
    60 }
  • 相关阅读:
    JavaWeb 项目,更改本地文件需刷新才有效问题 (tomcat相关)
    java设置项目根目录 工作目录 working dictionary
    得到JavaWeb项目在Tomcat中的运行路径
    java连接mysql数据库中文乱码问题
    java读utf8 的txt文件,第一个字符为空或问号问题
    java项目连接access数据库
    AJAX POST&跨域 解决方案
    MySQL5.6新特性Index conditontion pushdow
    MathML转换成OfficeML
    .net大型分布式电子商务架构说明(转载来自<头条>)
  • 原文地址:https://www.cnblogs.com/cao-lei/p/7222378.html
Copyright © 2011-2022 走看看