杭电历年复试题目——2017年

申明:写本篇文章的目的是为了方便自己使用,以下代码纯属自己编写,因为没有评测系统,因此无法保证正确性,若有人看到错误,请指正,谢谢。

题目1:关羽过关斩三将,输入四个人的武力值(大于0小于50),若超过界限需要重新输入,关羽的武力值x,将士武力值为y,满足(x-y)^2+(x-y)+41 若为素数则关羽获胜,若关羽三次获胜输出WIN,若失败则输出失败的将领序号(第几关)。

#include
#include
bool isprime(int x)
{
	if(x==1)
		return false;
	for(int i=2;i<=sqrt(x);i++)
		if(x%i==0)
			return false;
	return true;
}
int main()
{
	int y[4],temp;
	int win=0;
	for(int i=0;i<4;i++)
	{
		scanf("%d",&temp);
		if(0

题目2:
输入N个员工,每个员工输出ID号,上班时间,下班时间,
第一行输出 最早去的员工的ID和上班时间
第二行输出 最迟走的员工的ID和下班时间
第三行输出 工作最久的员工的ID和上班时间<按照数据来讲,按理来说应该是上班时间最久的>
(数据瞎编的)
sampleinput:
ID100001, 07:00:00 17:00:00
ID100002, 08:00:00 18:00:00
ID100003, 09:00:00 21:00:00
sampleout:
OPEN:ID100001, 07:00:00
CLOSE:ID100003, 21:00:00
STAR:ID100003, 12:00:00

#include
#include
using namespace std;
struct people
{
	char ID[10];
	int from_h,from_m,from_s;
	int to_h,to_m,to_s;
	int sum;
}p[1001];
bool cmp_open(people x,people y)
{
	if(x.from_h!=y.from_h)
		return x.from_hy.to_h;
	else if(x.to_m!=y.to_m)
		return x.to_m>y.to_m;
	else return x.to_s>y.to_s;
}
bool cmp_star(people x,people y)
{
	return x.sum>y.sum;
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=0;i

考虑到如果有多组数据输出的情况(即最早到的人有多个,最迟到的人有多个,上班时间最长的人有多个),代码修改如下:

#include
#include
using namespace std;
struct people
{
	char ID[10];
	int from_h,from_m,from_s;
	int to_h,to_m,to_s;
	int sum;
}p[1001];
bool cmp_open(people x,people y)
{
	if(x.from_h!=y.from_h)
		return x.from_hy.to_h;
	else if(x.to_m!=y.to_m)
		return x.to_m>y.to_m;
	else return x.to_s>y.to_s;
}
bool cmp_star(people x,people y)
{
	return x.sum>y.sum;
}
int main()
{
	int n;
	int mm,hh,ss,tag,temp;
	scanf("%d",&n);
	for(int i=0;i

题目3:有一个m×n的材料和一个s×t的模板,从材料中切除模板,求最大能切出来的模板的数量。
之前做了一种方式太暴力了,以至于一定会超时,所以我想着能不能用贪心来做。以下是我的思路,不知道对错,如果有错,希望可以指正。在一楼评论的帮助下,我对这题的代码和思路进行了重新的修改。
思路:
1.输入子母模板
2.用getpoint()找到母模板上所有子模板的左上角坐标,存入结构体point,注意一点,这里找到的子模板的坐标是按照先x从小变大,在x相等的情况下,y从小变大的顺序来的(这点可以自己体会)。
3.tag是标记数组,标记是否已经被占用
4.用DFS来遍历,子模板选或者不选,其中如果可以选的判断条件是被选中的子模板四个角的tag都是false。
5.输出最大的max_num

#include//找到所有的子模板位置
#include 
#include
using namespace std; 
#define MAX 100
char map_mom[MAX][MAX],map_son[MAX][MAX];
struct point//记录子模板的左上角的点的位子 
{
	int x,y;
}p[100];
struct Tag{
	bool tag[MAX][MAX];
};
int m,n,s,t;
int max_num;
int cnt;//记录字母表的数量,并且p数组按照x,y升序,其中x小的在前,然后y小的在前 
bool judge(int x,int y)
{
	for(int i=0;imax_num)
		max_num=num;
	if(nmax_num)//num+(cnt-n)>max_num如果后面的个数加上现在已经有的可能比max多 
	{
		int px,py;
		px=p[n].x;py=p[n].y;
		DFS(n+1,ta,num);
		if(!ta.tag[px][py]&&!ta.tag[px+s-1][py]&&!ta.tag[px][py+t-1]&&!ta.tag[px+s-1][py+t-1])//四个角都没有被填充过,可以说明这个位置可以要 
		{
			ta=marktag(px,py,ta);
			DFS(n+1,ta,num+1);
		}
	}
}
int main()
{
	int i,j;
	Tag ta;
	while(scanf("%d %d",&m,&n)!=EOF)
	{
		max_num=0;
		for(i=0;i

你可能感兴趣的:(杭电历年真题)