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代码如下:
- #include<stdio.h>
- #define MAX 21252
- int main()
- {
- int p, e, i, d, n, count = 0;
- while( scanf("%d%d%d%d", &p, &e, &i, &d) != EOF )
- {
- count++;
- if(p == -1 && e == -1 && i == -1 && d == -1)
- {
- break;
- }
- n = ( 5544 * p + 14421 * e + 1288 * i - d ) % MAX;
- if( n <= 0 ) // 范围限制
- {
- n += 21252;
- }
- printf("Case %d: the next triple peak occurs in %d days.\n", count, n );
- }
- return 0;
- }