三月十三日 大学先修课考试

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 查看本文章

猜你喜欢

转载自blog.csdn.net/chang_yl/article/details/79542690