POJ_S1E01_Enumeration & Basic Promblems

来源:互联网 发布:windows程序设计书籍 编辑:程序博客网 时间:2024/06/05 06:04
ENUMERATION
OUTLINE:
qPOJ1222Extended Lights Out
qPOJ1054The Troublesome Frog
画家问题
拨钟问题
+1018communication 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
原创粉丝点击