• POJ Biorhythms解题


    一、题目

    Description

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

    Input

    输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是给定的时间,可能小于p, e, 或 i。 所有给定时间是非负的并且小于365, 所求的时间小于21252。 

    当p = e = i = d = -1时,输入数据结束。

    Output

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

    采用以下格式: 
    Case 1: the next triple peak occurs in 1234 days. 

    注意:即使结果是1天,也使用复数形式“days”。

    Sample Input

    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

    Sample Output

    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.


    二、解题思路

    设置体力、感情和智力周期第一次高峰出现时间为A1、A2、A3,假定在X是下次出现三个高峰同天的时间,体力、感情和智力

    分别经过了C1、C2、C3个周期。则满足表达式:

    X = A1 + C1 * 23;

    X = A2 + C2 * 28;

    X = A3 + C3 * 33;

    根据上式可以推导出:

    C1 = (A3 - A1 + C3 * 33) / 23;

    C2 = (A3 - A2 + C3 * 33) / 28;

    只要针对指定的A1、A2、A3,对于给定的C3根据上式计算有C1和C2都是整数时则就是找的值。

    三、代码

    #include <iostream>
    #include <stdlib.h>
    #include <stdio.h>

    using namespace std;

    struct TimeNode
    {
    int p;
    int e;
    int i;
    int d;

    struct TimeNode* next;
    };

    int GetNextSameDays(struct TimeNode* pNode)
    {
    if (pNode==NULL)
    {
    return -1;
    }

    int p,e,i;
    p = pNode->p % 23;
    e = pNode->e % 28;
    i = pNode->i % 33;

    int nMaxIntell = (21252 + pNode->d) / 33;
    int nMinIntell = pNode->d / 33;
    int intellectual = nMinIntell;

    for (; intellectual <= nMaxIntell ; ++intellectual)
    {
    /// C1 = (A3 - A1 + C3*33) / 23;
    int curIntellectual = i + intellectual*33;

    if ( ((curIntellectual - p) % 23) != 0 )
    {
    continue;
    }

    if ( ((curIntellectual - e) % 28) != 0)
    {
    continue;
    }

    break;
    }

    if (intellectual > nMaxIntell)
    {
    return -1;
    }

    int nSameDays = (intellectual*33 + i - pNode->d);
    if (nSameDays <= 0)
    {
    nSameDays += 21252;
    }

    return nSameDays;
    }

    int main()
    {
    struct TimeNode* pHead = NULL;
    struct TimeNode* pCur = NULL;
    struct TimeNode* pTemp = NULL;
    //pHead = (struct TimeNode*)malloc(sizeof(struct TimeNode));
    // pCur = pHead;

    int p,e,i,d;
    while (cin >> p >> e >> i >> d)
    {
    if (p ==-1 && e==-1 && i==-1 && d==-1)
    {
    break;
    }

    pTemp = (struct TimeNode*)malloc(sizeof(TimeNode));
    pTemp->p = p;
    pTemp->e = e;
    pTemp->i = i;
    pTemp->d = d;
    pTemp->next = 0;

    if (pHead==NULL)
    {
    pHead = pCur = pTemp;
    }
    else
    {
    pCur->next = pTemp;
    pCur = pTemp;
    }
    }

    int nCaseIndex = 0;
    while (pHead!=NULL)
    {
    int nNextSameDays = GetNextSameDays(pHead);
    if ( nNextSameDays != -1)
    {
    cout << "Case " << ++nCaseIndex << ":" << " the next triple peak occurs in " << nNextSameDays << " days."<<endl;
    }

    pTemp = pHead->next;
    free(pHead);
    pHead = pTemp;
    }

    return 0;
    }



  • 相关阅读:
    prufer 序列 学习笔记
    题解 [SDOI2009]E&D/染色游戏/Moving Pebbles
    题解 Christmas Game
    题解 [HNOI/AHOI2018]毒瘤
    题解 UVA1500 Alice and Bob
    Mac端影片压制流程
    react:Text nodes cannot appear as a child
    阿里云docker镜像地址
    Vscode 智能插件
    vue-vant实现IndexBar索引栏
  • 原文地址:https://www.cnblogs.com/Quincy/p/2268306.html
Copyright © 2020-2023  润新知