您的位置:首页 > 其它

第一周 枚举 例题3.生理周期

2017-11-30 18:38 337 查看
MOOC 程序设计与算法(二)算法基础 郭炜 第三次开课

······个人学习记录······

问题描述:

输入:

  输入四个整数: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,有符合条件的就输出
//思路简单,代码性能较差
#include<iostream>
#include<cstdio>
using namespace std;
#define N 21252
int main()
{
int p, e, i, d;
int n = 1;
while (scanf("%d%d%d%d", &p, &e, &i, &d)) {
if (p == -1)
return 0;
for (int j = d+1; j <= N; j++)
{
if (((j - p) % 23 == 0) && ((j - e) % 28 == 0) && ((j - i) % 33 == 0))
{
printf("Case %d:", n++);
printf("the next triple peak occurs in %d days.\n", j - d);
}
}
}
return 0;
}


改良版:

//有条件的循环,节约很多时间空间
#include<iostream>
#include<cstdio>
using namespace std;
#define N 21252
int main()
{
int p, e, i, d;
int n = 1;
while (scanf("%d%d%d%d", &p, &e, &i, &d)) {
if (p == -1)
return 0;
int j;
//这一步找到了d之后的第一个体力高峰日
for (j = d + 1; (j - p) % 23; j++);
//这一步在体力高峰日的基础上,找到了一个同样是情感高峰的日子
for (; (j - e) % 28; j += 23);
//最后在体力情感双高峰的日子里面,找到一个还是智力高峰的日子
for (; (j - i) % 33; j += 23 * 28);
//输出结果
printf("Case %d:", n++);
printf("the next triple peak occurs in %d days.\n", j - d);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: