JZ初中OJ 1437. [普及组_在线赛]最小与最大

题目描述
做过了乘积最大这道题,相信这道题也难不倒你。 已知一个数串,可以在适当的位置加入乘号(设加了k个,当然也可不加,即分成k+1个部分),设这k+1个部分的乘积(如果k=0,则乘积即为原数串的值)对m 的余数(即mod m)为x; 现求x能达到的最小值及该情况下k的最小值,以及x能达到的最大值及该情况下的k的最小值(可以存在x的最小值与最大值相同的情况)。

以下是{原题:符文之语}另一种题目描述,题意相同:
{         当小 FF 来到神庙时,神庙已经破败不堪了。 但神庙的中央有一个光亮如新的石台。小 FF 走近石台,发现石台上有一个数串,而数串的上方刻着一串古老的符文之语。精通古符文之语的小 FF 不费吹灰之力就读懂了文章的意思, 其大意是:
         对于石台上的一串数字,你可以在适当的位置加入乘号(设加了 k 个,当然也可不加, 即分成 k+1 个部分),设这 k+1 个部分的乘积(如果 k=0,则乘积即为原数串的值)对 m 的余数(即 mod m)为 x;
         现求 x 能达到的最小值及该情况下 k 的最小值,以及 x 能达到的最大值及该情况下的 k 的最小值(可以存在 x 的最小值与最大值相同的情况)。
        小 FF 还知道, 如果他找到了正确的答案,那么就可以通往神庙的下层了。但这个问题似乎不太好解决, 小FF 就找到了你,并答应找到财宝以后和你二八分(当然你拿二……)。}
 
输入
第一行为数串,长度为n 满足2<=n<=1000,且数串中不存在0; 第二行为m,满足2<=m<=50。
输出
四个数,分别为x的最小值 和 该情况下的k,以及x的最大值和 该情况下的k,中间用空格隔开。
 
样例输入
4421
22
样例输出
0 1 21 0
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,a[1001],sum[1001][1001],dp[1001][100];
 4 char c[1001];
 5 int main()
 6 {
 7     freopen("minmax.in","r",stdin);
 8     freopen("minmax.out","w",stdout);
 9     for(int i=0;i<=1000;i++)
10     for(int j=0;j<=50;j++)
11     dp[i][j]=0x7f7f7f;
12     cin>>c>>m;    
13     int len=strlen(c); 
14     for(int i=0;i<len;i++)
15     a[i+1]=c[i]-'0';
16     for(int i=1;i<=len;i++)
17         for(int j=i;j<=len;j++)
18         sum[i][j]=(sum[i][j-1]*10+a[j])%m;
19     for(int i=1;i<=len;i++)
20     dp[i][sum[1][i]]=1;
21     for(int i=1;i<=len;i++)
22     {
23         for(int j=1;j<i;j++)
24         {
25             for(int k=0;k<=m-1;k++)
26             dp[i][(k*sum[j+1][i])%m]=min(dp[i][(k*sum[j+1][i])%m],dp[j][k]+1);
27         }
28     }
29     for(int i=0;i<=m-1;i++)
30     {
31         if(dp[len][i]!=0x7f7f7f)
32         {
33             cout<<i<<" "<<dp[len][i]-1<<" ";
34             break;
35         }
36     }
37     for(int i=m-1;i>=0;i--)
38     {
39         if(dp[len][i]!=0x7f7f7f)
40         {
41             cout<<i<<" "<<dp[len][i]-1<<" ";
42             break;
43         }
44     }
45     return 0;
46 }

 

转载于:https://www.cnblogs.com/anbujingying/p/11305960.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值