枚举——生理周期

156 阅读3分钟

「这是我参与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.");
	}
}

 

总结和建议

就这道题而言,大家要转换思维,我起初想的是第一个高峰的日子,第二个高峰的的日子,第三个高峰的日子,然后求当他们相等时,这样的话无意中你就有了三个变量,你应该转换思维,这样想,有一个日子他是第一个高峰的日子,也是第二、第三个高峰的日子,这样就相当于定义了一个变量。