ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

洛谷P1043

2022-09-15 09:34:19  阅读:202  来源: 互联网

标签:10 fr ch 洛谷 int res P1043 id


[NOIP2003 普及组] 数字游戏

题目描述

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

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

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

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

输入格式

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

输出格式

输出文件有 \(2\) 行,各包含 \(1\) 个非负整数。第 \(1\) 行是你程序得到的最小值,第 \(2\) 行是最大值。

样例 #1

样例输入 #1

4 2
4
3
-1
2

样例输出 #1

7
81

提示

【题目来源】

NOIP 2003 普及组第二题

事实证明,当你想不出状态方程时,记忆化搜索是一个不错的思路

//                  (ᗜ ‸ ᗜ)                    
//           去吧,鸭鸭,把希儿和AC都带回来!
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int INF = 0x3f3f3f3f3f3f3f3f;
int n, m;
int s[105];
int pre[105];
int dp[10][105][105][2];
int minn = INF;
int maxx = -INF;
void dfs(int id, int ls, int rs, int res, int fr)
{
    
    int sum = pre[rs] - pre[ls - 1];
    sum = (sum%10+10)%10;
    res = res * sum;
    int i = rs + 1;
    if (id == m)
    {
        maxx = max(res, maxx), minn = min(res, minn);
        return;
    }
    int flag1 = 0,flag2 = 0;
    
    if (dp[id][fr][rs][0] <= res)
        {
            flag1 = 1;
        }
    else
        dp[id][fr][rs][0] = res;
    if (dp[id][fr][rs][1] >= res){
        flag2 = 1;
    }
    else
        dp[id][fr][rs][1] = res;
    if(flag1 && flag2) return;
    if (id == m - 1)
    {
        dfs(id + 1, i, fr + n - 1, res, fr);
        return;
    }
    for (int j = i; n + fr - j >= m - id; j++){
        dfs(id + 1, i, j, res, fr);
    }
}
inline int read()
{
    int x = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x * f;
}
inline void print(int x)
{
    if (x < 0)
    {
        putchar('-');
        x = -x;
    }
    if (x > 9)
        print(x / 10);
    putchar(x % 10 + '0');
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= m; i++){
        for(int j = 1; j <= 2 * n; j++){
            for(int k = 1; k <= 2 * n; k++){
                dp[i][j][k][0] = INF;
                dp[i][j][k][1] = -INF;
            }
        }
    }
    for (int i = 1; i <= n; i++)
        cin >> s[i], s[i + n] = s[i];
    for (int i = 1; i <= 2 * n; i++)
        pre[i] = pre[i - 1] + s[i];
    if (m == 1)
    {
        dfs(1, 1, n, 1, 1); 
    }
    else{
    for (int i = 1; i <= n; i++)
        for (int j = i; n + i - j >= m; j++)
            dfs(1, i, j, 1, i);
    }
    cout << minn << endl;
    cout << maxx << endl;
    return 0;
}

标签:10,fr,ch,洛谷,int,res,P1043,id
来源: https://www.cnblogs.com/Sun-Wind/p/16695352.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有