E:生理周期
描述
人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23天、28天和33天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。
输入
一行,包含四个整数:p, e, i和d,相邻两个整数之间用单个空格隔开。 p, e, i分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是给定的时间,可能小于p, e, 或 i。 所有给定时间是非负的并且小于等于365, 所求的时间小于等于21252。
输出
一个整数,即从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。
样例输入
4 5 6 7
样例输出
16994
来源East Central North America 1999, POJ 1006, 程序设计实习2007
1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <memory.h> 5 #include <queue> 6 #include <math.h> 7 using namespace std; 8 const int maxn =30; 9 int p, e, i, d; 10 11 int main() 12 { 13 cin >> p >> e >> i >> d; 14 int _d = d; 15 d++; 16 for (; abs(d - p) % 23 != 0; d++); 17 for (; abs(d - e) % 28!=0; d += 23); 18 for (; abs(d - i) % 33 != 0; d += 23 * 28); 19 printf("%d\n", d-_d); 20 return 0; 21 }
F:完美立方
描述
形如a3= b3 + c3 + d3的等式被称为完美立方等式。例如123= 63 + 83 + 103 。编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a3 = b3 + c3 + d3,其中a,b,c,d 大于 1, 小于等于N,且b<=c<=d。
输入
一个正整数N (N≤100)。输出每行输出一个完美立方。
输出
格式为:
Cube = a, Triple = (b,c,d)
其中a,b,c,d所在位置分别用实际求出四元组值代入。
请按照a的值,从小到大依次输出。当两个完美立方等式中a的值相同,则b值小的优先输出、仍相同则c值小的优先输出、再相同则d值小的先输出。
样例输入
24
样例输出
Cube = 6, Triple = (3,4,5)
Cube = 12, Triple = (6,8,10)
Cube = 18, Triple = (2,12,16)
Cube = 18, Triple = (9,12,15)
Cube = 19, Triple = (3,10,18)
Cube = 20, Triple = (7,14,17)
Cube = 24, Triple = (12,16,20)
来源1543
1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <memory.h> 5 #include <queue> 6 #include <math.h> 7 using namespace std; 8 const int maxn =30; 9 int n; 10 11 int main() 12 { 13 cin >> n; 14 int a, b, c, d; 15 for (a = 3; a <= n; a++) 16 for (b = 2; b < a; b++) 17 for (c = b; c < a; c++) 18 for (d = c; d < a; d++) 19 if (a*a*a == b * b*b + c * c*c + d * d*d) 20 printf("Cube = %d, Triple = (%d,%d,%d)\n", a, b, c, d); 21 return 0; 22 }
I:放苹果
描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1
7 3
样例输出
8
来源lwx@POJ
1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <memory.h> 5 #include <queue> 6 #include <math.h> 7 using namespace std; 8 const int maxn =30; 9 int t; 10 11 int solve(int app, int pla) { 12 if (pla == 1)return 1; 13 if (app == 0)return 1; 14 if (pla > app)return solve(app, app); 15 return solve(app-pla,pla) + solve(app, pla - 1); 16 } 17 18 int main() 19 { 20 cin >> t; 21 while (t--) { 22 int m, n; 23 cin >> m >> n; 24 printf("%d\n",solve(m, n)); 25 } 26 return 0; 27 }
J:古代密码
描述
古罗马帝国有一个拥有各种部门的强大政府组织。其中一个部门就是保密服务部门。为了保险起见,在省与省之间传递的重要文件中的大写字母是加密的。当时最流行的加密方法是替换和重新排列。
替换方法是将所有出现的字符替换成其它的字符。有些字符会替换成它自己。例如:替换规则可以是将'A' 到 'Y'替换成它的下一个字符,将'Z'替换成 'A',如果原词是 "VICTORIOUS" 则它变成 "WJDUPSJPVT"。
排列方法改变原来单词中字母的顺序。例如:将顺序<2, 8="">应用到 "VICTORIOUS" 上,则得到"IVOTCIRSUO"。
人们很快意识到单独应用替换方法或排列方法加密,都是很不保险的。但是如果结合这两种方法,在当时就可以得到非常可靠的加密方法。所以,很多重要信息先使用替换方法加密,再将加密的结果用排列的方法加密。用两种方法结合就可以将"VICTORIOUS" 加密成"JWPUDJSTVP"。
考古学家最近在一个石台上发现了一些信息。初看起来它们毫无意义,所以有人设想它们可能是用替换和排列的方法被加密了。人们试着解读了石台上的密码,现在他们想检查解读的是否正确。他们需要一个计算机程序来验证,你的任务就是写这个验证程序。
输入
输入有两行。第一行是石台上的文字。文字中没有空格,并且只有大写英文字母。第二行是被解读出来的加密前的文字。第二行也是由大写英文字母构成的。
两行字符数目的长度都不超过100。
输出
如果第二行经过某种加密方法后可以产生第一行的信息,输出 "YES",否则输出"NO"。
样例输入
JWPUDJSTVP
VICTORIOUS
样例输出
YES
1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <memory.h> 5 #include <map> 6 #include <math.h> 7 using namespace std; 8 const int maxn =120; 9 map<char, int> mp1; 10 map<char, int> mp2; 11 int c1[maxn], c2[maxn]; 12 13 14 int main() 15 { 16 int flag = 1; 17 string before,after; 18 cin >> before >> after; 19 if (before.length() != after.length()) { 20 printf("NO\n"); 21 return 0; 22 } 23 int l = before.length(); 24 for (int i = 0; i < l; i++) { 25 mp1[before[i]]++; 26 mp2[after[i]]++; 27 } 28 map<char, int>::iterator i1 = mp1.begin(), i2 = mp1.end(), i3 = mp2.begin(), i4 = mp2.end(); 29 for (; i1 != i2; i1++)c1[(*i1).second]++; 30 for (; i3 != i4; i3++)c2[(*i3).second]++; 31 for(int i=0;i<maxn;i++) 32 if (c1[i] != c2[i]) { 33 flag = 0; 34 break; 35 } 36 if (flag)printf("YES\n"); 37 else printf("NO\n"); 38 return 0; 39 }
虽然这些题整理了也不会看……
但是这是现在唯一不用脑子能干的事了(滑稽)
基本是些计概题,按我的复习速度肯定不会复习这些题了……