北大OJ1006

转载 2015年11月20日 17:37:19
人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为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.

以下转自http://www.51ojr.com/report/full/78

解决思路

  中国剩余定理,本题难点不在编程,而是分析题目并转化为数学公式

  要引入本题解法,先来看一个故事 “韩信点兵”:
      传说西汉大将韩信,由于比较年轻,开始他的部下对他不很佩服。有一次阅兵时,韩信要求士兵分三路纵队,结果末尾多2人,改成五路纵队,结果末 尾多3人,再改成七路纵队,结果又余下2人,后来下级军官向他报告共有士兵2395人,韩信立即笑笑说不对(因2395除以3余数是1,不是2),由于已 经知道士兵总人数在2300~2400之间,所以韩信根据23,128,233,------,每相邻两数的间隔是105(3、5、7的最小公倍数),便 立即说出实际人数应是2333人(因2333=128+20χ105+105,它除以3余2,除以5余3,除以7余2)。这样使下级军官十分敬佩,这就是 韩信点兵的故事。 

  韩信点兵问题简化:已知 n%3=2,  n%5=3,  n%7=2,  求n。 

   再看我们这道题,读入p,e,i,d 4个整数

  已知(n+d)%23=p;   (n+d)%28=e;   (n+d)%33=i ,求n 。 

  两道题是一样的。但是韩信当时计算出结果的? 
  韩信用的就是“中国剩余定理”,《孙子算经》中早有计算方法,大家可以查阅相关资料。 
  “韩信点兵”问题计算如下: 

  因为n%3=2, n%5=3, n%7=2
      我们先找一个最小的数能被5和7整除,并且除以3的余数为1,这里,我们可以找到最小的数是70。有什么好处呢,大家知道70 * 1 % 3 = 1,那么70 * 2 % 3 = 2,70 * a  % 3 = a,这样可以方便找到140这个除以3余数又为2的数,同时又能被5和7整除。

       同理,我们可以找到21是能被3和7整除但是除以5余数是1的数,那么63便是除以5余数是3. 15能被3和5整除,但是除以7余数是1,那么30便是除以7余数是2的数。

       那么  140 + 63 + 30 = 233,必定是一个除以3余数是2,除以5余数是3,除以7余数是2的一个数,而我们又很容易知道233加上或者减去3,5,7的最小公倍数,得到的数同样满足这个性质。韩信已知士兵人数在2300~2400之间,所以只需要233 + i × lcm(3,5,7)= 233 + 105 * 20 = 2333.

  同样,这道题的解法就是:

  假设过n天后,三个生理周期同时到高峰。 

已知(n+d)%23=p;   (n+d)%28=e;   (n+d)%33=i 
       使33×28×a被23除余1,用33×28×8=5544; 
       使23×33×b被28除余1,用23×33×19=14421; 
       使23×28×c被33除余1,用23×28×2=1288。 
      因此有(5544×p+14421×e+1288×i)% lcm(23,28,33) =n+d 

  又23、28、33互质,即lcm(23,28,33)= 21252;
      所以有n=(5544×p+14421×e+1288×i-d)%21252

  本题所求的是最小整数解,避免n为负,因此最后结果为n= [n+21252]% 21252
  那么最终求解n的表达式就是:

  n=(5544*p+14421*e+1288*i-d+21252)%21252;

  当问题被转化为一条数学式子时,你会发现它无比简单。。。。直接输出结果了。

#include<iostream>
using namespace std;
 
int main(void)
{
    int p,e,i,d;
    int time=1;
    while(cin>>p>>e>>i>>d)
    {
        if(p==-1 && e==-1 && i==-1 && d==-1)
            break;
 
        int lcm=21252;  // lcm(23,28,33)
        int n=(5544*p+14421*e+1288*i-d+21252)%21252;
        if(n==0)
            n=21252;
        cout<<"Case "<<time++<<": the next triple peak occurs in "<<n<<" days."<<endl;
    }
    return 0;
}

解法二:遍历

#include<stdio.h>
int main(){
    int p,e,i,d,count;
    count=1;
while(1){
scanf("%d %d %d %d",&p,&e,&i,&d);
if(p==-1&&e==-1&&i==-1&&d==-1){
break;
}
int x;
for(x=1;x<=21252;x++){
if((x+d-p)%23==0&&(x+d-e)%28==0&&(x+d-i)%33==0){
printf("Case %d: the next triple peak occurs in %d days.\n",count,x);
count++;
break;
}
}

}
return 0;
}

九度oj 题目1006:ZOJ问题 【ZJU2010考研机试题2】【容易理解混乱】

题目1006:ZOJ问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:12461 解决:2064 题目描述: 对给定的字符串(只包含'z','o','j'三种字符),...
  • u010069101
  • u010069101
  • 2014年03月06日 09:51
  • 891

九度OJ 1006 ZOJ问题 (这题测试数据有问题)

题目1006:ZOJ问题 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:15725 解决:2647 题目描述: 对给定的字符串(只包含'z','o','j'三种字符),...
  • wdkirchhoff
  • wdkirchhoff
  • 2014年12月17日 08:19
  • 2494

Light OJ:1006 Hex-a-bonacci(水题)

1006 - Hex-a-bonacci     PDF (English) Statistics Forum Time Limit: 0.5...
  • zugofn
  • zugofn
  • 2016年08月25日 17:38
  • 151

南师oj1006

Hero In Maze Time Limit: 1000 ms   Case Time Limit: 1000 ms   Memory Limit: 64 MB Descript...
  • xjcjichao10
  • xjcjichao10
  • 2016年03月24日 19:07
  • 163

北大医药不是北京大学的本色校企,北大校企管理混乱

北大医药不是北京大学的本色校企,北大校企管理混乱实际情况是,实际上,在2013年,北大医药是由“西南合成医药集团有限公司”更名而来,北大不是它的大股东,更不是北京大学的产学研一体化的本色校企!为何冠名...
  • yuanmeng001
  • yuanmeng001
  • 2017年08月03日 06:57
  • 740

北大ACM poj1002 487-3279

487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 191845   Acc...
  • gubojun123
  • gubojun123
  • 2012年07月28日 21:19
  • 3823

北大acm1001题解题报告

求高精度幂 Time Limit: 500MS   Memory Limit: 10000K Total Submissions: 120823   Accepted: 29507 ...
  • luoluoxiaocainiao
  • luoluoxiaocainiao
  • 2013年08月10日 17:13
  • 1715

北大OJ 1001题

题目:输入一序列的正实数和幂次(正整数)对,然后打印结果(具体的比这个精细) 这道题是关于大数计算的(大数求幂),从开始建立思路,到写代码、调式到最后被AC以及最终的优化,总共用了差不多一天的时...
  • chiichen
  • chiichen
  • 2011年08月14日 13:32
  • 3367

北大牛人唐翔(贴一篇文章激励一下自己)

题记:想必很多人都看过这篇文章吧。我也是很久以前就看过,今天看见篇解释文章,顺便一起转了。比如说,我的老板姜伯驹和王诗宬,一个是两院院士,一个是长江学者,都曾获得过陈省身数学奖。我当然跟他们彼此认识,...
  • tangl_99
  • tangl_99
  • 2006年07月19日 11:17
  • 14033

北京大学复试听力题型

    全校统考,所占分值为3分,但有的系规定这门不及格也不能通过复试,内容酷似托福,全部为选择题,共30题。分为三部分。    第一部分:statements(7 ×1)    第二部分:conve...
  • Felomeng
  • Felomeng
  • 2008年05月14日 09:32
  • 2457
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:北大OJ1006
举报原因:
原因补充:

(最多只允许输入30个字)