根据回忆整理的复试上机题型,有意向报考西电计算机专业的同学可以试试做下。
第一题:
/*问题描述:最近很火的微信游戏跳一跳游戏规则如下:短跳得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 main()
{
int n;
while(cin>>n)
{
int ans=0,last=0,c=1;
for(int i=0;iint tmp;
cin>>tmp;
if(tmp==0) // 结束
break;
if(tmp==1) // 短跳
{
ans+=1;
c=1;
}
if(tmp==2)
{
if(last==2) // 连续长跳
{
ans+=2*c;
c++;
}
else // 单次长跳
{
ans+=2;
c++;
}
}
last=tmp; //保存上一跳
}
cout<return 0;
}
第二题:
/* 最长连续公共子序列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
思路:解决此类公共子序列典型解题方法就是使用动态规划
*/
#define MAX 101
#define GMax(x,y) x>y?x:y
#include
#include
#include
using namespace std;
// dp数组
int dp[MAX][MAX];
int main()
{
char str1[MAX];
char str2[MAX];
gets(str1);
gets(str2);
int a=strlen(str1);
int b=strlen(str2);
int max_len=0; // 最大长度
// 初始化序列
for(int i=0;i<=a;i++)
dp[i][0]=0;
for(int j=0;j<=b;j++)
dp[0][j]=0;
// 注意这里不需要计算到dp[a][b],因为str[a]=str[b],长度会多加1
// 递推动态规划
for(int i=1;ifor(int j=1;jif(str1[i]==str2[j])
{
dp[i][j]=dp[i-1][j-1]+1;
// 更新最大长度
if(dp[i][j]>max_len)
max_len=dp[i][j];
}
else
// 非连续写法
// dp[i][j]=GMax(dp[i-1][j],dp[i][j-1]);
//连续写法 重新计数
dp[i][j]=0;
}
int c=max_len;
float ans=(float)c/(a+b);
//规格化输出
cout<cout<2)<return 0;
}
第三题:
/* 面积涂色问题
描述:已知根据矩形的左下角右上角左边可以唯一确定一个矩形位置,给出多个矩形坐标对其面积单元进行涂色
其中重叠面积只涂一次,求涂色面积单元个数。
输入格式:首先输入涂色矩形个数n(n<100),接着分别输入每个矩形的左下角与右上角左边(0<=x<=100
0<=y<=100),按行分隔
输出格式:输出涂色面积单元个数
输入样例:
2
1 1 4 5
2 3 5 6
输出样例:
17
*/
//思路:由于坐标范围为0<=x<=100,0<=y<=100,共计10000个面积单元,不大,可直接使用二维数组存储单元涂色情况
// 使用(1,1)代表第一个单元,(i,j)代表第i行第j列个单元 ,即使用单元格右上角左边来代表单元
//其中 (0,0) 不适用
#define MAX 101
#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;ifor(int j=0;j0;
// 输入矩形
for(int i=0;icin>>R[i].p1.x>>R[i].p1.y>>R[i].p2.x>>R[i].p2.y;
//面积单元涂色
for(int i=0;ifor(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;ifor(int j=0;j// 单元已涂色,则加一
if(A[i][j])
ans++;
}
cout<return 0;
}
第四题:
/* 多关键字排序
描述: 给定一组记录n(n<100)小明各个时期的考试成绩 ,格式为日期+成绩,中间以空格隔开,记录之间
分行输入 ,例如
2008/6/3 80
2009/1/1 56
….
其中日期输入要求年份1996-2100 月份1-12 日期1-31
现要求以分数为关键字从大到1小对其进行排序,若分数相同则按日期从小到大排序
输入样例
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
思路:这是一个典型的多关键字排序问题,可建立恰当结构体,利用stl自带的排序算法实现快速解题
*/
#define MAX 100
#define IsLeap(x) x%4==0&&x%100!=0 ||x%400==0
#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//日期有效性检测
bool isValid(char* str)
{
int y,m,d;
int dd;//二月天数
bool valid=true;
sscanf(str,"%d/%d/%d",&y,&m,&d);
if(y<1996||y>2100)
valid=false;
if(m<1||m>12)
valid=false;
if(IsLeap(y)&&m==2) //闰年加1
dd=Day[m]+1;
else
dd=Day[m];
if(d<1||d>Day[m])
valid=false;
return valid;
}
int main()
{ // 记录数组
Record res[MAX];
bool flag[MAX];
int n;
while(cin>>n)
{
//有效数组初始化
for(int i=0;itrue;
// 输入记录
for(int i=0;icin>>res[i].date>>res[i].grade;
// 根据自定义排序规则排序
sort(res,res+n,cmp);
// 格式化输出,过滤掉无效日期
for(int i=0;iif(isValid(res[i].date))
cout<" "<return 0;
总结:上级考试时间为1个半小时,4道编程题,其中第二题偏难,最后一题代码量偏大,需对输入数据进行特殊处理。总体来讲,没有考特别难的算法,需要多加练习基础编程题。注意把握时间,先做容易拿分的题。