zoukankan      html  css  js  c++  java
  • 1085 数字游戏

    1085 数字游戏

     

    2003年NOIP全国联赛普及组

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 黄金 Gold
     
     
    题目描述 Description

    丁丁最近沉迷于一个数字游戏之中。这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易。游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k。游戏的要求是使你所得的k最大或者最小。

    例如,对于下面这圈数字(n=4,m=2):

                                      2

                       4                           -1

                                     3

    当要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3) mod 10)×(-1 mod 10)=9×9=81。特别值得注意的是,无论是负数还是正数,对10取模的结果均为非负值。

    丁丁请你编写程序帮他赢得这个游戏。

    输入描述 Input Description

    输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9)。以下n行每行有个整数,其绝对值不大于104,按顺序给出圈中的数字,首尾相接。

    输出描述 Output Description

    输出文件有两行,各包含一个非负整数。第一行是你程序得到的最小值,第二行是最大值。

    样例输入 Sample Input

    4 2

    4

    3

    -1

    2

    样例输出 Sample Output

    7

    81

    数据范围及提示 Data Size & Hint

    en

    f[i][j]=max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10))的意义是前k个数划分成j-1份,所以前i个数划分成j份的最大值是k到i的和Mod10 * 前k个数划分成j-1份

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 using namespace std;
     5 int sum[210],a[210];
     6 int f[210][20],g[210][10];
     7 int n,m,minn = 0x7f,maxn = 0;
     8 void dp(int num[])
     9 {
    10     memset(f,0,sizeof(f));
    11     memset(g,0x3f,sizeof(g));
    12     for (int i=1; i<=n; ++i)    
    13         sum[i] = sum[i-1]+num[i];    
    14     for (int i=1; i<=n; ++i)
    15         f[i][1] = g[i][1] = (sum[i]%10+10)%10;
    16     for (int j=2; j<=m; ++j)
    17         for (int i=j; i<=n; ++i)
    18             for (int k=j-1; k<=i-1; ++k)
    19             {
    20                 f[i][j] = max(f[i][j],f[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
    21                 g[i][j] = min(g[i][j],g[k][j-1]*(((sum[i]-sum[k])%10+10)%10));
    22             }
    23     minn = min(minn,g[n][m]);
    24     maxn = max(maxn,f[n][m]);
    25 }
    26 int main()
    27 {
    28     scanf("%d%d",&n,&m);
    29     for (int i=1; i<=n; ++i)
    30     {
    31         scanf("%d",&a[i]);
    32         a[i+n] = a[i];
    33     }
    34     for (int i=0; i<n; ++i)
    35         dp(a+i);
    36     printf("%d
    %d",minn,maxn);
    37     return 0;
    38 }
  • 相关阅读:
    通过16道练习学习Linq和Lambda
    sql server 2000,一个数据库最多能建多少张表,每张表最多能建多少个字段?
    通过EPPlus导出Excel文件
    SQLServer找出执行慢的SQL语句
    C# where用法
    双击桌面Internet Explorer图标时创建快捷方式
    xxxx.accessor: The reference to 'xxxx' was not found in the list of this projects references
    .NET设计模式(3): 抽象工厂模式
    关于Windows Installer的一些知识点
    详细介绍"使用DB Attach的方式来升级MOSS2007中SSP的user profile和mysite至SharePoint 2010"的文章
  • 原文地址:https://www.cnblogs.com/mjtcn/p/7061024.html
Copyright © 2011-2022 走看看