「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」
大家好,我是洋哥。今天给大家带来的是每日一题——枚举生理周期。
题目要求
人有体力、情商、智商的高峰日子,它们分别每隔 23天、28天和33天出现一次。对于每个人,我们想知道何时三个高峰落在同一天。给定三个高峰出现的日子p,e和i(不一定是第一次高峰出现的日子),再给定另一个指定的日子d,你的任务是输出日子d之后,下一次三个高峰落在同一天的日子(用距离d的天数表示)。例如:给定日子为10,下次出现三个高峰同一天的日子是12,则输出2。
输入
输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和智力高峰出现的日子。d是给定的日子,可能小于p, e或 i。所有给定日子是非负的并且小于或等于365,所求的日子小于或等于 21252。
输出
从给定日子起,下一次三个高峰同一天的日子(距离给定日子的天数)。
输入样例
5 20 34 325
输出样例
the next triple peak occurs in 19575 days.
建议用时:10-15分钟
难度:中等
知识点考察
这道题是典型的枚举问题,而且是那种题目长看着就烦的那种。主要考察的是枚举和循环。三高峰的日子必然是体力、情商、智商的高峰日子。
问题分析
第一,做这种文字量大的题目一定要有耐心,慢慢来。其实这道题并不复杂。只要抓住一点即可,三高峰的日子必然是体力、情商、智商的高峰日子。
第二,所以如果有一天是体力、情商、智商的高峰日子就是三高峰日子。我们把日子设为k,我们从d+1天开始试,只要(k-p)%23==0,(k-e)%28==0,(k-i)%33==0同时满足,那么这个k-d就是我们题目的答案(题目要求要-d)。
第三,这道题我们还可以进行优化。这样一个一个枚举,一个一个试,太慢,我们可以跳着试。首先我们从d+1开始枚举,当试到一个k满足(k-p)%23==0时,我们就不在一个一个试来,我们直接k+= 23这样,更快。然后等到(k-e)%28==0时,这时k就是两高峰的日子,最后以k+= 23*28来试,因为这两个数最小公倍数就是乘积,当(k-i)%33==0时,这时的k值就是所求,输出k-d即可。
相关知识点复习
枚举、for循环
代码实现
package suanfa;
import java.util.Scanner;
public class MeijJu2 {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
System.out.println("请输入p值");
int p=scan.nextInt();
System.out.println("请输入e值");
int e=scan.nextInt();
System.out.println("请输入i值");
int i=scan.nextInt();
System.out.println("请输入d值");
int d=scan.nextInt();
//改进前的代码
// for(int k=d+1;k<=21252;k++){
// if((k-p)%23==0&&(k-e)%28==0&&(k-i)%33==0){
// System.out.println("the next triple peak occurs in "+(k-d) +" days.");
// }
// }
//改进后的代码
int k;
for( k=d+1;(k-p)%23!=0;++k);
for(;(k-e)%28!=0;k+=23);
for(;(k-i)%33!=0;k+=(23*28));
System.out.println("the next triple peak occurs in "+(k-d) +" days.");
}
}
总结和建议
就这道题而言,大家要转换思维,我起初想的是第一个高峰的日子,第二个高峰的的日子,第三个高峰的日子,然后求当他们相等时,这样的话无意中你就有了三个变量,你应该转换思维,这样想,有一个日子他是第一个高峰的日子,也是第二、第三个高峰的日子,这样就相当于定义了一个变量。