A:吃糖果
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0)。妈妈告诉名名每天可以吃一块或者两块巧克力。假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。例如:如果N=1,则名名第1天就吃掉它,共有1种方案;如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案;如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案;如果N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。现在给定N,请你写程序求出名名吃巧克力的方案数目。
- 输入
- 输入只有1行,即整数N。
- 输出
- 输出只有1行,即名名吃巧克力的方案数。
- 样例输入
-
4
- 样例输出
-
5
- 来源
- 医学部计算概论2006期末考试题
-
- 斐波拉契数列,没啥好说的。
-
-
-
-
#include<bits/stdc++.h> using namespace std; #define MAXN 25 long long a[MAXN]; int main() { int n; scanf("%d",&n); a[0] = 1; a[1] = 1; for(int i = 2;i <= n; i++) { a[i] = a[i - 1] + a[i - 2]; } printf("%d",a[n]); return 0; }
B:话题焦点人物
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
微博提供了一种便捷的交流平台。一条微博中,可以提及其它用户。例如Lee发出一条微博为:“期末考试顺利 @Kim @Neo”,则Lee提及了Kim和Neo两位用户。
我们收集了N(1 < N < 10000)条微博,并已将其中的用户名提取出来,用小于等于100的正整数表示。
通过分析这些数据,我们希望发现大家的话题焦点人物,即被提及最多的人(题目保证这样的人有且只有一个),并找出那些提及它的人。
- 输入
-
输入共两部分:
第一部分是微博数量N,1 < N < 10000。
第二部分是N条微博,每条微博占一行,表示为:
发送者序号a,提及人数k(0 < = k < = 20),然后是k个被提及者序号b1,b2...bk;
其中a和b1,b2...bk均为大于0小于等于100的整数。相邻两个整数之间用单个空格分隔。 - 输出
-
输出分两行:
第一行是被提及最多的人的序号;
第二行是提及它的人的序号,从小到大输出,相邻两个数之间用单个空格分隔。同一个序号只输出一次。 - 样例输入
-
5 1 2 3 4 1 0 90 3 1 2 4 4 2 3 2 2 1 3
- 样例输出
-
3 1 2 4
- 来源
- 医学部计算概论2011年期末考试(谢佳亮)
-
- 模拟题,按照题意直接写成代码就行。
- 打了个暴力,因为判断去重很麻烦,直接打了标记,遍历了1~100。
- 代码:
-
#include<bits/stdc++.h> using namespace std; const int MAXN = 10005; int n; int who[MAXN]; bool people[105][MAXN]; int menp[MAXN]; int main() { cin >> n; int maxp = -1,order; for(int i = 1; i <= n; i++) { int num,k,t = 1; scanf("%d %d",&num,&k); who[i] = num; for(int j = 1;j <= k; j++) { int x; scanf("%d",&x); people[x][num] = true; menp[x]++; if(maxp < menp[x]) { maxp = menp[x]; order = x; } } } printf("%d\n",order); for(int i = 1;i <= 101; i++) { if(people[order][i] == true) printf("%d ",i); } return 0; }
C:完美立方
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
形如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
- 看到代码的各位都可以看出是纯粹的暴力题
- 代码:
-
#include<bits/stdc++.h> using namespace std; int n; int main() { scanf("%d",&n); for(int i = 2;i <= n; i++) for(int j = 2;j <= n; j++) for(int k = j;k <= n; k++) for(int l = k;l <= n; l++) if(i * i * i == j * j * j + k * k * k + l * l * l) { printf("Cube = %d, Triple = (%d,%d,%d)\n",i, j, k, l); } return 0; }
D:478-3279
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
在美国,商家都喜欢用好记的电话号码。人们常用的方法就是把电话号码拼成一个便于记忆的词汇或者短语,比如你可以通过Gino比萨店的电话号码301- GINO来定比萨。另一个方法就是把电话号码分为成组的数字,比如你可以通过必胜客的电话“三个十”:3-10-10-10来定比萨。
一个七位电话号码的标准形式是xxx-xxxx,如 123-4567。
通常,电话上的数字与字母的映射关系如下
A, B, C 映射到 2
D, E, F 映射到 3
G, H, I 映射到 4
J, K, L映射到5
M, N, O映射到6
P, R, S映射到7
T, U, V映射到8
W, X, Y映射到9
Q和Z并没有相关的映射。
你的任务就是把一个七位电话号码转为标准的xxx-xxxx格式,其中x表示数字 - 输入
- 第一行为输入的电话号码个数n(n < 100), 下面n行每行表示一个七位号码,这些号数为了便于记忆可能不是标准格式,但一定是合法的。
- 输出
- 对于行输入,输出一个标准格式的电话号码
- 样例输入
-
12 4873279 ITS-EASY 888-4567 3-10-10-10 888-GLOP TUT-GLOP 967-11-11 310-GINO F101010 888-1200 -4-8-7-3-2-7-9- 487-3279
- 样例输出
-
487-3279 487-3279 888-4567 310-1010 888-4567 888-4567 967-1111 310-4466 310-1010 888-1200 487-3279 487-3279
就映射处理一下然后连接符处理一下。。。。实际上做的有点麻烦。。#include<bits/stdc++.h> using namespace std; #define MAXN 110005 char str[105]; int flag = 0; char s[MAXN][105]; int sum[MAXN]; bool book[MAXN]; int main() { int t,n = 0,j; char ch; cin >> t; for(int i = 0;i < t;i++) { scanf("%s",str); int x = 0; for(int i = 0;i < strlen(str);i++) { if(str[i] == '-'){ scanf("%c",ch); continue; } else { if(str[i] >= '0' && str[i] <= '9'|| (str[i] == 'Q'|| str[i] == 'Z')) { sum[n] = sum[n]*10 + (str[i]-'0'); } else{ if(str[i] - 'A' < 3) { sum[n] = sum[n]*10+2; } else if(str[i] - 'A' < 6) { sum[n] = sum[n]*10+3; } else if(str[i] - 'A' < 9) { sum[n] = sum[n]*10+4; } else if(str[i] - 'A' < 12) { sum[n] = sum[n]*10+5; } else if(str[i] - 'A' < 15) { sum[n] = sum[n]*10+6; } else if(str[i] - 'A' < 19) { sum[n] = sum[n]*10+7; } else if(str[i] - 'A' < 22) { sum[n] = sum[n]*10+8; } else if(str[i] - 'A' < 25) { sum[n] = sum[n]*10+9; } } } } n++; } for(int i = 0;i < n;i++) { printf("%03d-%04d\n",sum[i]/10000,sum[i]%10000); } return 0; }
F:棋盘问题
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
- 输入
-
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
- 输出
- 对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
- 样例输入
-
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1
- 样例输出
-
2 1
- 来源
- 蔡错@pku
-
- 就最常规的深搜,没啥好说的。
-
-
#include<iostream> #include<cstdio> #include<cstring> using namespace std; char a[10][10]; int book[10]; int n,k; int total,m; void DFS(int cur) { if(k == m) { total++; return ; } if(cur>=n) return ; for(int j = 0; j < n; j++) if(book[j] == 0 && a[cur][j] == '#') { book[j] = 1; m++; DFS(cur+1); book[j] = 0; m--; } DFS(cur+1); } int main() { int i,j; while(scanf("%d%d",&n,&k)&&n != -1&&k != -1) { total = 0; m = 0; for(i = 0; i < n; i++) scanf("%s",&a[i]); memset(book,0,sizeof(book)); DFS(0); printf("%d\n",total); } return 0; }
G:多边形游戏
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
一个多边形,开始有n个顶点。每个顶点被赋予一个正整数值,每条边被赋予一个运算符“+”或“*”。所有边依次用整数从1到n编号。
现在来玩一个游戏,该游戏共有n步:
第1步,选择一条边,将其删除
随后n-1步,每一步都按以下方式操作:(1)选择一条边E以及由E连接着的2个顶点v1和v2; (2)用一个新的顶点取代边E以及由E连接着的2个顶点v1和v2,将顶点v1和v2的整数值通过边E上的运算得到的结果值赋给新顶点。
最后,所有边都被删除,只剩一个顶点,游戏结束。游戏得分就是所剩顶点上的整数值。那么这个整数值最大为多少? - 输入
- 第一行为多边形的顶点数n(n ≤ 20),其后有n行,每行为一个整数和一个字符,整数为顶点上的正整数值,字符为该顶点到下一个顶点间连边上的运算符“+”或“*”(最后一个字符为最后一个顶点到第一个顶点间连边上的运算符)。
- 输出
- 输出仅一个整数,即游戏所计算出的最大值。
- 样例输入
-
4 4 * 5 + 5 + 3 +
- 样例输出
-
70
- 提示
-
小规模问题可不必用动态规划方法编程求解,仅用递归就可以求解。
计算中不必考虑计算结果超出整数表达范围的问题,给出的数据能保证计算结果的有效性。
在给的例子中,计算过程为(3+4)*(5+5)=70。 -
- 听教于某个不愿意透露姓名的陈大爷,写出的算法。
- 时间复杂度挺高的,不知道该怎么优化。
- 具体做法是枚举每一条边,环状枚举,以及在这个基础上进行进一步的枚举连接点,连通块与点之间,枚举一个最大值。
-
#include<bits/stdc++.h>
using namespace std;
#define MAXN 25
int n;
int ans = -100;
int point[MAXN][MAXN];
int line[MAXN];
int a[MAXN];
char s[MAXN];
int search1(int l,int r)
{
int a1,a2;
if(point[l][r]) return point[l][r];
else if(l == r) return a[l];
else{
for(int i = 0;i < (r + n - l) % n; i++)
{
a1 = search1(l, (l + i) % n);
a2 = search1((l + i + 1) % n,r);
if(s[(l + i) % n] == '*') a1 *= a2;
else a1 += a2;
if(!point[l][r])
point[l][r] = a1;
else if(a1 > point[l][r]) point[l][r] = a1;
}
return point[l][r];
}
}
int search(int l)
{
int a1,a2;
for(int i = 1;i < n; i++)
{
a1 = search1((l + 1)%n,(l + i) % n);
a2 = search1((l + i + 1) % n,l);
if(s[l] == '*') a1 *= a2;
else a1 += a2;
if(!line[l]) line[l] = a1;
else if(a1 > line[l]) line[l] = a1;
}
return line[l];
}
int main()
{
cin >> n;
for(int i = 0;i < n; i++)
{
scanf("%d",&a[i]);
cin >> s[i];
}
for(int i = 0;i < n; i++)
{
ans = max(ans,search(i));
}
printf("%d",ans);
return 0;
}
扫描二维码关注公众号,回复:
1624447 查看本文章