2018年复试算法题

1.微信跳一跳

问题描述:最近很火的微信游戏跳一跳游戏规则如下:短跳得1分,跌落游戏结束,长跳得2分,并且长跳可连续累加,第一次2分,第二次4分,依次类推,若长中断则重新计分2分。
现给定0,1,2的组合序列,其中0:跌落 1:短跳成功 2:长跳成功
请你计算玩家当次游戏的合计得分。

输入格式:首先输入一个数字n代表当前游戏状态变化数,接着输入n个由0,1,2组合的数字,0代表结束。

输出格式:输出玩家当次游戏得分。

输入案例:
6
1 2 2 1 2 0
输出结果:10

#include
using namespace std;
int cal_sum(int a[],int n){
	int sum=0,c=0;
	for(int i=0;i<n;i++){
		switch(a[i]){
			case 1:
				sum=sum+1;
				c=0;
				break;
			case 2:
				sum=sum+2*(c+1);
				c++;
				break;
			default:
				break;
		}
	}
	return sum; 
}
int main(){
	int n;
	int sum=0;
	cin>>n;
	int a[n];
	for(int i=0;i<n;i++){
		cin>>a[i]; 
	}
	sum=cal_sum(a,n);
	cout<<sum<<endl;
	return 0;
}

2.最长公共连续子序列

最长连续公共子序列LCS
问题描述:输入两个字符串s1,s2,设s1长度为a,s2长度为b,s1与s2的最长公共子串长度为c,定义公共因子
d=c/(a+b),要求求得d并输出,结果保留两位小数

输入格式:输入两个字符串s1,s2,长度不大于100,以空格隔开
输出格式:输出公共因子d,结果保留两位小数

输入案例:
abcde abgde
输出案例:
0.20

两字符串具有连续公共子序列ab,c=2,a=b=5,于是有d=c/(a+b)=2/10=0.20

#include
#include
#include
using namespace std;
const int N = 100;
char A[N], B[N];
int dp[N][N];
 
int main (){
	int n; 
	gets(A + 1);
	gets(B + 1);
	int lenA = strlen(A + 1);
	int lenB = strlen(B + 1);
	int maxlen = 0;
	memset (dp, 0, sizeof(dp));
	for(int i = 0; i <= lenA ;i ++){
		dp[i][0] = 0;
	}
	for(int i = 0; i <= lenB; i++){
		dp[0][i] = 0;
	}
	for(int i = 1; i <= lenA; i++){
		for(int j = 1; j <= lenB; j++){
			if(A[i] == B[j]){
				dp[i][j] = dp[i - 1][j - 1] + 1;
			}
			if(maxlen < dp[i][j]){
				maxlen = dp[i][j];
			}
		} 
	}

	float result;
	result=(float)maxlen/(lenA+lenB);
	printf("%.2f\n", result);
	return 0;
} 

2018年复试算法题_第1张图片

3.面积涂色问题

描述:已知根据矩形的左下角右上角左边可以唯一确定一个矩形位置,给出多个矩形坐标对其面积单元进行涂色
其中重叠面积只涂一次,求涂色面积单元个数。

输入格式:首先输入涂色矩形个数n(n<100),接着分别输入每个矩形的左下角与右上角左边(0<=x<=100
0<=y<=100),按行分隔

输出格式:输出涂色面积单元个数

输入样例:
2
1 1 4 5
2 3 5 6

输出样例:
17

2018年复试算法题_第2张图片

#define MAX 101
#include
#include
using namespace std;
typedef struct Point{
	int x,y;
	
}Point;
typedef struct Rect{
	Point p1,p2;
}Rect;
int A[MAX][MAX];
Rect R[MAX];
int main(){
	int n;
	while(cin>>n)
	{
		for(int i=0;i<MAX;i++)
			for(int j=0;j<MAX;j++)
				A[i][j]=0;
		for(int i=0;i<n;i++)
			cin>>R[i].p1.x>>R[i].p1.y>>R[i].p2.x>>R[i].p2.y;
		for(int i=0;i<n;i++)
			for(int j=R[i].p1.x+1;j<=R[i].p2.x;j++)
				for(int k=R[i].p1.y+1;k<=R[i].p2.y;k++)
				{
					if(A[j][k]==0)
						A[j][k]=1;
				}
		int ans=0;
		for(int i=0;i<MAX;i++)
			for(int j=0;j<MAX;j++)
			{
				if(A[i][j])
					ans++;
			}
		cout<<ans<<endl;
	}
	return 0;
}

4.多关键字排序

描述: 给定一组记录n(n<100)小明各个时期的考试成绩 ,格式为日期+成绩,中间以空格隔开,记录之间
分行输入 ,例如
2008/6/3 80
2009/1/1 56
….
其中日期输入要求年份1996-2100 月份1-12 日期1-31

现要求以分数为关键字从大到小对其进行排序,若分数相同则按日期从小到大排序

输入样例
4
2017/1/1 95
2017/6/10 85
2017/3/2 95
2017/1/1 65

输出样例
2017/1/1 95
2017/3/2 95
2017/6/10 85
2017/1/1 65

sscanf的作用:从一个字符串中读进于指定格式相符的数据。利用它可以从字符串中取出整数、浮点数和字符串。

sscanf和scanf的区别:scanf是以键盘作为输入源,sscanf是以字符串作为输入源。
#define MAX 100
#define IsLeap(x) x%4==0&&x%100!=0||x%400==0
#include
#include
#include
using namespace std;
int Day[13]={
	0,31,28,31,30,31,30,31,31,30,31,30,31
} ;
typedef struct{
	char date[100];
	int grade;
	
}Record;
bool cmp(Record x,Record y)
{
	if(x.grade!=y.grade)
		return x.grade>y.grade;
	return x.date<y.date;
}
bool isValid(char* str)
{
	int y,m,d;
	int dd;
	bool vaild=true;
	sscanf(str,"%d/%d/%d",&y,&m,&d);
	if(y<1996||y>2100)
		vaild=false;
	if(m<1||m>12)
		vaild=false;
	if(IsLeap(y)&&m==2)
		dd=Day[m]+1;
	else
		dd=Day[m];
	if(d<1||d>Day[m])
		vaild=false;
	return vaild;
}
int main(){
	Record res[MAX];
	bool flag[MAX];
	int n;
	while(cin>>n)
	{
		for(int i=0;i<n;i++)
			flag[i]=true;
		for(int i=0;i<n;i++)
			cin>>res[i].date>>res[i].grade;
		sort(res,res+n,cmp);
		for(int i=0;i<n;i++)
			if(isValid(res[i].date))
			cout<<res[i].date<<" "<<res[i].grade<<endl;
	}
	return 0;
}

你可能感兴趣的:(王道考研机试题,算法,c++,数据结构)