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代码如下:
- #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;
- }
0 0
- POJ_S1E01_Enumeration & Basic Promblems
- @Basic
- Basic
- Basic
- BASIC
- @Basic
- @Basic
- basic
- Unix Basic
- BASIC 1
- basic 3
- BASIC 4
- BASIC 5
- BASIC 6
- BASIc b
- basic string
- [Visual Basic]
- oracle basic
- Android--活动的实践
- CArray 2&CHugeInt
- class MyString
- quiz: Polymorphism & qsort
- 《Android 4 编程入门经典》读书笔记 之 简单进度对话框
- POJ_S1E01_Enumeration & Basic Promblems
- POJ_S1E02_Recursion&DP(1)
- 【机房收费系统重构版】一键检查、清空控件text属性
- POJ_S1E02_Recursion&DP(2)
- POJ_S1E02_Recursion&DP(3)
- POJ_S1E02_Recursion&DP(4)
- POJ_S1E03_DFS&BFS(1)
- C++上机实验2-2
- POJ_S1E03_DFS&BFS(2)