算法基础学习【1】(上):枚举(完美立方,生理周期,POJ013称硬币)

#include <iostream> #include <cstdio> using namespace std; int main() { int n; cin >> n; int i, j, k, l; for (i = 2; i <= n; i++) { for (j = 0; j <= i-1; j++) { for (k = 0; k < j-1; k++) { for (l = 0; l < k-1; l++) { if (i * i* i == j * j * j + k * k * k + l * l * l) { cout << i << "^3 " << " = " << j << "^3 + " << k << "^3 + " << l << "^3 " << endl; } } } } } } /* 解题思路: 四重循环,abcd,枚举算法 a设置范围【2,n】b设为【2,a-1】以此类推 从大到小还是从小到大试取决于输出 */

#include <cstdio> #include <iostream> int main() { int p=23, e=28, i=33, d=0; int k; int flag = 1; printf("输入天\n"); scanf_s("%d", &d); for (k = d; k < 21252; k++) { if(((k - p) % 23 == 0) && ((k - e) % 28 == 0) && ((k - i) % 33 == 0)) { printf("下一天为:%d ", k-d ); flag = 0; } } if (flag) { printf("不在范围内\n"); } } /* 解题思路: 从d+1天到21252天循环 判断p,e,i,d与相应间隔的余数 */
还有另一种更为快捷的方法:
//以下是更快捷的实现方法 #include <iostream> using namespace std; int main() { int p, e, i, d, CaseNo = 0; while (cin >> p >> e >> i >> d) { ++CaseNo; //加法器,计算数据测试的组数 int k; //设k为枚举的日子 for (k = d + 1; (k - p) % 23; ++k); //这里筛选出了属于23倍数的数字,++k for (; (k - e) % 28; k += 23); //筛选出同为28与23倍数的数字 for (; (k - i) % 33; k += 23 * 28); //最后筛选出满足三者的乘积倍数的数字 { cout << "case:" << CaseNo << endl; cout << "the next peak occurs in " << k - d << endl; } } return 0; }

(这图片是聪明方法)
POJ1013: 有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。 输入 第一行是测试数据组数。 每组数据有三行,每行表示一次称量的结果。硬币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示: 天平左边放置的硬币 天平右边放置的硬币 平衡状态。其中平衡状态用“up”, “down”, 或 “even”表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。 输出 输出哪一个标号的硬币是假币,并说明它比真币轻还是重。 输入样例 1 ABCD EFGH even ABCI EFJK up ABIJ EFGH even 输出样例 K is the counterfeit coin and it is light

(原题)http://poj.org/problem?id=1013
#include <iostream> #include <cstring> using namespace std; char Left[3][7]; //存储天平左边硬币 char Right[3][7]; //存储天平右边硬币 char Result[3][7]; //存储结果 bool IsFake(char c, bool light); //判断函数,真表示假币c是轻的,假表示假币c为重的,返回值true,假设成立 bool IsFake(char c, bool light) { for (int i = 0; i < 3; ++i) { char* pLeft, * pRight; if (light) { pLeft = Left[i]; pRight = Right[i]; } else { pLeft = Right[i]; pRight = Left[i]; } switch (Result[i][0]) { case'u': if (strchr(pRight, c) == NULL) return false; break; case 'e': if (strchr(pLeft, c) || strchr(pRight, c)) return false; break; case 'd': if (strchr(pLeft, c) == NULL) return false; break; } } } int main() { int t; cin >> t; while (t--) { for (int i = 0; i < 3; ++i) cin >> Left[i] >> Right[i] >> Result[i]; for (char c = 'A'; c <= 'L'; c++) { if (IsFake(c, true)) { cout << c << " is the fake coin and its light\n"; break; } else if (IsFake(c, false)) { cout << c << "is the fake coin and its heavy\n"; break; } } } }

(TODO:其他方法未看)

浙公网安备 33010602011771号