2017年杭电计算机研究生复试笔试题目
//2017 N1
/*关羽过关斩三将,输入四个人的武力值(大于0小于50),若超过界限需要重新输入,关羽的武力值x,将士武力值为y,满足(x-y)^2+(x-y)+41 若为素数则关羽获胜,若关羽三次获胜输出WIN,若失败则输出失败的将领序号(第几关)。*/
#include<stdio.h>
#include<math.h>
int is_prime(int n)
{
int i;
for ( i = 2; i <= sqrt(double(n)); i++)
{
if (n%i==0)
{
break;
}
}
//假如是素数
if (i>sqrt(double(n)))
{
return 1;
}
else
{
return 0;
}
}
int main()
{
int x, y[4];
int i;
int sum = 0;
while (~scanf("%d",&x))
{
for (i = 1; i < 4; i++)
{
scanf("%d", &y[i]);
}
for ( i = 1; i < 4; i++)
{
sum = (x-y[i]) *(x-y[i]) + (x - y[i]) + 41;
//如果第三次也是素数
if (is_prime(sum)&&i==3)
{
printf("WIN\n");
}
//如果当前的sum不是素数,则就输出第几关,跳出循环
else if (!is_prime(sum))
{
printf("第%d关\n",i);
break;
}
//如果当前的sum是素数,则就继续
else
{
continue;
}
}
}
return 0;
}
//N2
/*输入N个员工,每个员工输出ID号,上班时间,下班时间,第一行输出最早去的员工的ID和上班时间第二行输出最迟走的员工的ID和下班时间第三行输出工作最久的员工的ID和上班时间(数据瞎编的)
sampleinput:
ID100001,07:00:0017:00:00
ID100002,08:00:0018:00:00
ID100003,09:00:0021:00:00
sampleout:
OPEN:ID100001,07:00:00
CLOSE:ID100003,21:00:00
(..):ID100003,12:00:00
*/
#include<stdio.h>
#include<algorithm>
#define N 100
typedef struct time
{
int hour;
int min;
int sec;
}time;
typedef struct Person
{
char id[N];
struct time t1,t2;
int worktime;
}Person;
Person p[N];
//第一行:最早去的员工的ID和上班时间;
//第二行:最迟走的员工的ID和下班时间;
//第三行:输出工作最久的员工的ID和上班时间
//比较员工的上班时间的早晚,得出上班时间早的,先比较小时,再比较分,最后比较秒,从高到底
bool cmp1(const Person& p1,const Person& p2)
{
if (p1.t1.hour!=p2.t2.hour)
{
return p1.t1.hour < p2.t1.hour;
}
else if (p1.t1.min!=p2.t1.min)
{
return p1.t1.min < p2.t1.min;
}
else
{
return p1.t1.sec < p2.t1.sec;
}
}
//比较员工的下班时间早晚,降序排序
bool cmp2(const Person& p1, const Person& p2)
{
if (p1.t1.hour != p2.t2.hour)
{
return p1.t1.hour > p2.t1.hour;
}
else if (p1.t1.min != p2.t1.min)
{
return p1.t1.min > p2.t1.min;
}
else
{
return p1.t1.sec > p2.t1.sec;
}
}
//求工作时间,还有一种简单直接的方法,就是全部转化为秒,再相减;下面的方法稍微麻烦
int cal_work_time( Person& p1)
{
/*int sum=0,sum1=0,sum2=0;
sum1=p1.t1.hour*3600+p1.t1.min*60+p1.t1.sec;
sum2=p1.t2.hour*3600+p1.t2.min*60+p1.t2.sec;
sum=sum2-sum1;
p1.worktime=sum;
*/
//p1.t2与p1.t1的差,先做秒的差值,再做分钟的差值,最后做时的差值
int sum = 0;
//当下班时间的秒钟比上班时间的秒钟大
if (p1.t2.sec>p1.t1.sec)
{
sum = sum + (p1.t2.sec - p1.t1.sec);
}
//当下班时间的秒钟比上班时间的秒钟小,则向下班时间的分钟减去一
else
{
p1.t2.min -= 1;
sum = sum + (p1.t1.sec - p1.t2.sec);
}
//当下班时间的分钟比上班时间的分钟大
if (p1.t2.min>p1.t1.min)
{
sum = sum + 60*(p1.t2.min - p1.t1.min);
}
//当下班时间的分钟比上班时间的分钟小,则向下班时间的时钟减去一
else
{
p1.t2.hour -= 1;
sum = sum + 60 * (p1.t1.min - p1.t2.min);
}
//当下班时间的时钟比上班时间的时钟大
sum = sum + 3600 * (p1.t2.hour - p1.t1.hour);
return sum;
}
//输出工作最久的员工的ID和上班时间,要先算出工作时间
bool cmp3(Person& p1, Person& p2)
{
p1.worktime = cal_work_time(p1);
p2.worktime = cal_work_time(p2);
return p1.worktime > p2.worktime;
}
using namespace std;
int main()
{
int n;
int i;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%s%d%d%d%d%d%d%d", p[i].id, &p[i].t1.hour, &p[i].t1.min,&p[i].t1.sec,&p[i].t2.hour,&p[i].t2.min,&p[i].t2.sec,&p[i].worktime);
//用cmp1,排序后的第一个人是上班时间最早的
sort(p, p + n, cmp1);
printf("上班时间最早的员工其ID是:%s;其上班时间为:%d-%d-%d", p[0].id, p[0].t1.hour, p[0].t1.min, p[0].t1.sec);
//用cmp2,排序后的第一个人是下班时间最晚的
sort(p, p + n, cmp2);
printf("下班时间最晚的员工其ID是:%s;其下班时间为:%d-%d-%d", p[0].id, p[0].t2.hour, p[0].t2.min, p[0].t2.sec);
//用cmp3,排序后
sort(p, p + n, cmp3);
printf("工作时间最晚的员工其ID是:%s;其上班时间为:%d-%d-%d", p[0].id, p[0].t1.hour, p[0].t1.min, p[0].t1.sec);
}
return 0;
}
//N3
/*有一个M*N的材料和一个s*t的模板,从材料中切除模板,求最大能切出来的模板的数量。
sample input
:
3 4
a b c d
c d a b
a c c d
2 2
a b
c d
sample out
2 */
#include<stdio.h>
#define MX 100
#define MY 100
char map1[MX][MY];//存储大图
char map2[MX][MY];//存储小图
int N, M, n, m;
int ans;
int max;
//判断大图里面是否包含小图
bool judge(char Map[MX][MY], int x, int y)
{
for (int i = 0; i < m;i++)
{
for (int j = 0; j < n; j++)
{
if (Map[x+i][y+j]!=map2[i][j])
{
return false;
}
}
}
return true;
}
void dfs(char map[MX][MY],int x,int y,int max)
{
if (max>ans)//更新答案
{
ans = max;
}
if (y>=n)
{
return;
}
//第一列走完,换第二列
if (x >= m)
{
dfs(map, 0, y + 1, max);
}
else
{
if (judge(map,x,y))
{
char temp[MX][MY] = { 0 };
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
temp[i][j] = map[i][j];
}
}
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
temp[x + i][y + j] = '0';
}
}
dfs(temp, x + m, y, max + 1);//确定取这一块儿
dfs(map, x + 1, y, max);//不取这一块儿,按部就班继续走
}
else
{
dfs(map, x + 1, y, max);//不匹配则按列走
}
}
}
int main()
{
//int M, N;
int i, j;
scanf("%d%d", &M, &N);
//将大图读入
for (i = 0; i < M; i++)
{
for ( j = 0; j < N; j++)
{
scanf("%c%c", &map1[i][j]);
}
}
//将小图读入
//int m, n;
scanf("%d%d", &m, &n);
for ( i = 0; i < m; i++)
{
for ( j = 0; j < n; j++)
{
scanf("%c%c", &map2[i][j]);
}
}
ans = 0;
dfs(map1, 0, 0, 0);
printf("%d\n", ans);
return 0;
}