【算法系列之枚举】生理周期

  • 题目

    人有体力、情商、智商的高峰日子,它们分别每隔 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。

  • 输出

    从给定日子起,下一次三个高峰同一天的日子(距离给定日子 的天数)。

  • 样例输入

    0 0 0 0

    0 0 0 100

    5 20 34 325

    4 5 6 7

    283 102 23 320

    203 301 203 40

    -1 -1 -1 -1

  • 样例输出

    Case 1: the next triple peak occurs in 21252 days.

    Case 2: the next triple peak occurs in 21152 days.

    Case 3: the next triple peak occurs in 19575 days.

    Case 4: the next triple peak occurs in 16994 days.

    Case 5: the next triple peak occurs in 8910 days.

    Case 6: the next triple peak occurs in 10789 days

  • 解题思路

    从d+1天开始,一直试到第21252 天,对其中每个日期k,看 是否满足 (k – p)%23 == 0 && (k – e)%28 == 0 && (k-i)%33 == 0    (比较慢)

  • 完整代码
#include <iostream>
#include <cstdio>
using namespace std;
#define N 21252
int main(){
  int p,e,i,d,caseNo = 0;
  while( cin >> p >> e >>i >>d && p!= -1) {
    ++ caseNo;//测试第几组数据
    int k;
    for(k = d+1; (k-p)%23; ++k);
    for(; (k-e)%28; k+= 23);//体力、情商双高峰,体力出现周期为23,故每隔23天找一次情商高峰
    for(; (k-i)%33; k+= 23*28);//体力、情商、智商三高峰,前提是体力、情商都是高峰日,故每隔体力和情商的“最小公倍数”天找一次情商高峰
    cout << "Case " << caseNo <<": the next triple peak occurs in " << k-d << " days." << endl;     }   return 0; }
时间: 2024-12-16 12:33:33

【算法系列之枚举】生理周期的相关文章

枚举--生理周期

题目:生理周期 人有体力.情商.智商的高峰日子,它们分别每隔23天.28天和33天出现一次.对于每个人,我们想知道何时三个高峰落在同一天.给定三个高峰出现的日子p,e和i(不一定是第一次高峰出现的日子),再给定另一个指定的日子d,你的任务是输出日子d之后,下一次三个高峰落在同一天的日子(用距离d的天数表示).例如:给定日子为10,下次出现三个高峰同一天的日子是12,则输出2. 输入:输入四个整数:p,e,i和d.p,e,i分别表示体力.情感和智力高峰出现的日子.d是给定的日子,可能小于p,e或i

【算法系列之枚举】称硬币

题目 有12枚硬币.其中有11枚真币和1枚假币.假币和真 币重量不同,但不知道假币比真币轻还是重.现在, 用一架天平称了这些币三次,告诉你称的结果,请你 找出假币并且确定假币是轻是重(数据保证一定能找 出来). 输入 第一行是测试数据组数. 每组数据有三行,每行表示一次称量的结果.银币标号 为A-L.每次称量的结果用三个以空格隔开的字符串表示: 天平左边放置的硬币 天平右边放置的硬币 平衡状态.其 中平衡状态用``up'', ``down'', 或 ``even''表示, 分 别为右端高.右端低

生理周期 枚举算法问题

趁着寒假抓紧自学C++..... 生理周期问题是比较简单的算法问题,运用到了  枚举  的思想. 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为 23 天. 28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例 如,智力周期的高峰,人会思维敏捷,精力容易高度集中.因为三个周期的周长不同,所以 通常三个周期的高峰不会落在同一天.对于每个人,我们想知道何时三个高峰落在同一天. 对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不

2977 生理周期(简单的枚举例子)

描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏捷,精力容易高度集中.因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天.对于每个人,我们想知道何时三个高峰落在同一天.对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间).你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间

C语言程序设计100例之(9):生理周期

例9    生理周期 问题描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为 23 天.28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏捷,精力容易高度集中.因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天.对于每个人,我们想知道何时三个高峰落在同一天. 对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间).你的任务是给定一个从当年第一天开始数的天数

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示 算法系列之二十三离散傅立叶变换之音频播放与频谱显示 导语 什么是频谱 1 频谱的原理 2 频谱的选择 3 频谱的计算 显示动态频谱 1 实现方法 2 杂项说明 结果展示 导语 频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷.在上一篇对离散傅立叶变换介绍的基础上,本篇就进一步介绍一下频谱是怎么回事儿,下一篇继续介绍

[算法系列之二十]字典树(Trie)

一 概述 又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 二 优点 利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高. 三 性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符: (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串: (3)每个节点的所有子节点包含的字符都不相同. 单词列表为"apps&

算法系列2——RSA

1. RSA介绍 RSA公钥加密算法是1977年由Ron Rivest.Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的.RSA取名来自开发他们三者的名字.RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准.RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥. RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的

生理周期 (poj 1006) 题解

[问题描述] 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为23天.28天和33天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏捷,精力容易高度集中.因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天.对于每个人,我们想知道何时三个高峰落在同一天.对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间).你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括