18.06.27 水题整理(3)--1st 上机

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

虽然这些题整理了也不会看……

但是这是现在唯一不用脑子能干的事了(滑稽)

基本是些计概题,按我的复习速度肯定不会复习这些题了……

猜你喜欢

转载自www.cnblogs.com/yalphait/p/9234317.html