哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级) J 小乐乐和25 【分类】...

题目描述 

小乐乐特别喜欢25这个数字,他想把所有的数字都变成25的倍数。
现在小乐乐得到一个数字,想问问你最少用几次操作才可以把这个数字改造成25的倍数。
对于一次操作我们可以把相邻的两位做交换,比如123经过一次操作之后就可以变成213或者132。
 

输入描述:

多组数据输入

对于每组数据,只有一行输入一个整数n(1 <= n <= 1000000000)。

输出描述:

如果经过最少x次操作后,这个数就变成了25的倍数,那么输出x;

如果这个数无论怎么变化都变不成25的倍数,输出-1.
 
 

解题思路:

写出25的倍数

25、50、100、125、150、175、200、225、250、275、300....

其实最后交换得到的数能不能被 25 整除 关键在于 最后两位 是不是 00、 25、 50、 75

因为百位以上可以被 100 整除,所以判断 最后两位即可,分四类讨论一下,判断那种交换方式操作次数最小。

 

AC  code:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <cmath>
 6 #include <map>
 7 #define INF 0x3f3f3f3f
 8 #define LL long long
 9 using namespace std;
10 const int MAXN = 100;
11 char num[MAXN];
12 int len;
13 
14 int cou(int v1, int v2)
15 {
16     if(v1==len-1)   return len-1-v2;
17     else if(v2<v1)   return len-2-v1-1+len-1-v2;
18     else if(v1<v2)   return len-2-v1+len-1-v2;
19     return 100;
20 }
21 
22 int main()
23 {
24     while(~scanf("%s", num)){
25         len = strlen(num);
26         int zo1 = -1, zo2 = -1, sev = -1, two = -1, five = -1;
27         for(int i = len-1; i >= 0; i--){
28             if(num[i] == '0'){
29                 if(zo2 != -1) continue;
30                 if(zo1 == -1) zo1 = i;
31                 else zo2 = i;
32             }
33 
34             if(num[i] == '2'){
35                 if(two == -1) two = i;
36             }
37 
38             if(num[i] == '5'){
39                 if(five == -1) five = i;
40             }
41 
42             if(num[i] == '7'){
43                 if(sev == -1) sev = i;
44             }
45         }
46         int ans = 101;
47         if(zo1 != -1 && zo2 != -1) ans = min(ans, cou(zo2, zo1));   //00
48         if(two != -1 && five != -1) ans = min(ans, cou(two, five)); //25
49         if(five != -1 && zo1 != -1) ans = min(ans, cou(five, zo1)); //50
50         if(sev != -1 && five != -1) ans = min(ans, cou(sev, five));  //75
51 
52         if(ans == 101) puts("-1");
53         else printf("%d\n", ans);
54     }
55     return 0;
56 
57 }

 

 

转载于:https://www.cnblogs.com/ymzjj/p/10052530.html

主要内容:本文详细介绍了一种QRBiLSTM(分位数回归双向长短期记忆网络)的时间序列区间预测方法。首先介绍了项目背景以及模型的优势,比如能够有效利用双向的信息,并对未来的趋势上限和下限做出估计。接着从数据生成出发讲述了具体的代码操作过程:数据预处理,搭建模型,进行训练,并最终可视化预测结果与计算分位数回归的边界线。提供的示例代码可以完全运行并且包含了数据生成环节,便于新手快速上手,深入学习。此外还指出了模型未来发展的方向,例如加入额外的输入特性和改善超参数配置等途径提高模型的表现。文中强调了时间序列的标准化和平稳检验,在样本划分阶段需要按时间序列顺序进行划分,并在训练阶段采取合适的手段预防过度拟合发生。 适合人群:对于希望学习和应用双向长短时记忆网络解决时序数据预测的初学者和具有一定基础的研究人员。尤其适用于有金融数据分析需求、需要做多一步或多步预测任务的从业者。 使用场景及目标:应用于金融市场波动预报、天气状况变化预测或是物流管理等多个领域内的决策支持。主要目的在于不仅能够提供精确的数值预计还能描绘出相应的区间概率图以增强结论置信程度。 补充说明:本教程通过一个由正弦信号加白噪构造而成的简单实例来指导大家理解和执行QRBiLSTM流程的所有关键步骤,这既方便于初学者跟踪学习,又有利于专业人士作为现有系统的补充参考工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值