MOOC 生理周期

    xiaoxiao2021-03-26  29

    生理周期

    Description

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

    Code: 分析:直接来看也很简单,无非就是从1~21252全部枚举一遍即可,但是效率实在太低,更何况换在OJ上可能TLE怎么才能提高效率呢? 跳着试! 最后输出的结果肯定是满足 (k-p)# && (k-e)( && (k-i)3

    那么满足第一个条件的k和k+23的之间的值肯定不是答案,就不需要再去试了,而是以 k+=23去实验满足第二个的K(如果此时k成立,不就意味着第一第二个条件都满足嘛!!!),同理第三个条件。 上代码,一目了然。

    #include <cstdio> #include <iostream> using namespace std; int main() { int p, e, i, d, caseNo = 0; while(cin >> p >> e >> i >> d && p >= 0)//保证了p不为负数 { ++caseNo; int k; for(k=d+1; (k-p)%23; ++k); for(; (k-e)%28; k+=23); for(; (k-i)%33; k+=23*28); cout << "caseNo" << caseNo << ":the next tripe peak occurs in" << k-d << endl; } return 0; } ReCclay 认证博客专家 嵌入式软件开发 机器/深度学习 全栈技术学习者 大家好,我是博主ReCclay,目前处于研究生阶段,就读于电子科技大学,主攻方向为汽车辅助驾驶算法研究。入站以来,凭借坚持与热爱,以博文的方式分享所学,截止目前累计博文数量达800余篇,累计受益人次达130w+次,涉及领域包括但不限于物联网开发、单片机开发、Linux驱动开发、FPGA开发、前/后端软件开发等。在未来我将继续专注于嵌入式相关领域,学习更多的科技知识,输出更高质量的博文。
    转载请注明原文地址: https://ju.6miu.com/read-658535.html

    最新回复(0)