非常简单一模拟,使我小脑旋转
题目传送门
思路
首先想到的就是把题目给定的字符串转换为整数,我们可以枚举字符串的每一位,在遇到 : 前,将对应的数字加到表示小时的变量上,遇到 : 后,将对应的数字加到表示分钟的变量上。
代码:
bool f1=false,f2=false;
for(int i=0;i<a.size();i++){if(a[i]==':'){f1=true;continue;}if(f1) s1+=a[i]-'0',s1*=10;else m1+=a[i]-'0',m1*=10;
}
s1/=10,m1/=10;
for(int i=0;i<b.size();i++){if(b[i]==':'){f2=true;continue;
}if(f2) s2+=b[i]-'0',s2*=10;else m2+=b[i]-'0',m2*=10;
}
s2/=10,m2/=10;
需要注意的一点是,由于我们在每次加上后都会 $\times$ 一个 $10$,这会导致最终结果多了一个 $0$,所以我们要在处理完后对其进行 $\div 10$ 操作。
处理完字符串后剩下的就很简单了,这道题只有 $+1$ 这一种操作,如果有 $-1$ 就会难得多了 (虽说无论什么题我都先写搜索)。
发现当 $s_1>s_2$ 时,是一定会进位的,所以我们不妨将 $s_2+60$,这样就不用再考虑进位的情况了(仅限于 $s_1>s_2$),当然记得将 $m_1$ 也 $+1$(因为进位)。然后计算按按钮 A 的次数也很简单,由于每次只能 $+1$,所以 $s_2-s_1$ 就是按按钮 A 的次数。
按按钮 B 的整体思路与按按钮 A 大差不差,唯一区别的一点是当 $m_1>m_2$ 时所需加上的数变成了 $24$。
$Code$
#include<bits/stdc++.h>
using namespace std;
string a,b;
int m1,m2,s1,s2,ans;
int main(){std::ios::sync_with_stdio(false); // 加速std::cin.tie(nullptr);std::cout.tie(nullptr);cin>>a>>b;bool f1=false,f2=false; // 处理字符串,前文已经提到过for(int i=0;i<a.size();i++){if(a[i]==':'){f1=true;continue;}if(f1) s1+=a[i]-'0',s1*=10;else m1+=a[i]-'0',m1*=10;}s1/=10,m1/=10;for(int i=0;i<b.size();i++){if(b[i]==':'){f2=true;continue;}if(f2) s2+=b[i]-'0',s2*=10;else m2+=b[i]-'0',m2*=10;}s2/=10,m2/=10;if(s1>s2) s2+=60,m1++; // 处理s1>s2的情况ans+=s2-s1;if(m1>m2) m2+=24; // 处理m1>m2的情况ans+=m2-m1;cout<<ans;return 0;
}