题目详情:
思路简介:
这也是一道很基础的枚举题,首先确定枚举变量,再确定枚举变量的范围和限制条件,再确定对枚举变量的操作和判断。输入时给出四个日子,p,e,i,d。要求判断出在第四个日子后,三个特殊日子再次同一天的天数。最终的结果是以第四个日子为基准,输出相对于此过了多少天。所以可以以距离第四个日子过了多少天作为枚举变量,不妨设为k,k初始为d+1,过了多少天三个日子重合的最小天数,必须是23的倍数,也是28的倍数,同时也是33的倍数。提到最小,显然此处是涉及到三者的最小公倍数,不用一个个枚举。我们可以通过进一步的优化,来加快我们的查找,虽然这样的数据范围并不大,优化枚举范围和操作对最终的结果区别不大,但这更重要的是一种习惯,一种追求能不能更优的习惯,这点在学习算法的过程中是非常重要的,如果只要求能过就行,那可能在算法学习的过程中是很难坚持下去的。话不多说,递上AC代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a, b, c, d;
int t, caseno = 0;
while (cin >> a >> b >> c >> d && a != -1 ) {
++caseno;
int k;
for (k = d + 1; (k - a) % 23; k++);//一重循环先找到d天之后相对于a天后的首次体力高峰期
for (; (k - b) % 28; k += 23);//现在第k天是体力高峰期,判断其相对于b天后是否是首次情商高峰期,每次递增23,即体力高峰期的周期
for (; (k - c) % 33; k += 23 * 28);//与上同理
cout << "Case " << caseno <<
" : the next triple peak occurs in " << k - d << " days." << endl;//按要求输出便可
}
return 0;
}