POJ_S1E01_Enumeration & Basic Promblems

ENUMERATION
OUTLINE:
q POJ1222 Extended Lights Out
q POJ1054 The Troublesome Frog
画家问题
拨钟问题
+1018 communication system
Basic Idea:
关灯问题:
1.  拓宽边界法,简化边界处理——通常是遇到“边界渲染”(上下左右对中心点影响)的问题;
2. N进制思想——每个点涉及N种状态(在这里是2种,on or off),因此实际上是一个N进制表示问题,枚举时可用N进制遍历;
3. 做好数据维护——涉及try类问题,注意1)cpy 2)分离初始值和后增变量,做好数据初始化(实际上等效于数据还原)
恼人的青蛙:
1. 找合理数据中的最大值问题;
2. 枚举方法——初始两点确定等差数列
剪枝——是不是“初始”两点?
是不是“valid”?
是不是最大值?
3. 重排剪枝顺序,求效率最大化
communication system:
1. 找合理数据中的最大值问题;
2. 枚举方法——按B值分类(由剪枝策略而来)
from minB to min(maxB in every type)
剪枝——固定B,找最小P
BASIC PROBLEMS
OUTLINE:
浮点数高精度幂  
生理周期
Basic idea:
    模拟大法

贴一段生理周期中国剩余数定理解法

现在看看此题:x % 23 == p; x % 28 == e; x % 33 == i;求x

按照以上算法: 

使 33 * 28 * a % 23 = 1,得a = 6; 33 * 28 * 6 = 5544; 

使23 * 33 * b % 28 = 1, 得b = 19;23 * 33 * 19 = 14421; 
使23 * 28 * c % 33 = 1, 得c = 2;  23 * 28 * 2 = 1288。 

那么x  =  5544 * p + 14421 * e + 1288 * i

那么x-d即相差的时间天数!

因为有范围限制,那么(x-d) %= 21252;且如果此时<=0,那么(x-d)  += 21252   ,以上都只是为了保证在范围内而已~

AC代码如下:

  1. #include<stdio.h>  
  2.   
  3. #define MAX 21252  
  4.   
  5. int main()  
  6. {  
  7.     int p, e, i, d, n, count = 0;  
  8.       
  9.     while( scanf("%d%d%d%d", &p, &e, &i, &d) != EOF )  
  10.     {  
  11.                 count++;  
  12.         if(p == -1 && e == -1 && i == -1 && d == -1)  
  13.         {  
  14.             break;  
  15.                 }  
  16.   
  17.         n = ( 5544 * p + 14421 * e + 1288 * i - d ) % MAX;  
  18.           
  19.         if( n <= 0 )   // 范围限制   
  20.         {  
  21.             n += 21252;  
  22.                 }  
  23.           
  24.         printf("Case %d: the next triple peak occurs in %d days.\n", count, n );  
  25.     }  
  26.     return 0;  
  27. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值