杭电复试笔试2016-2017

1.判断一个数N是否是素数,是的话输出“YES”,否则输出“NO”。(判断2-sqrt(N)是否存在N的因子即可)

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<math.h>
using namespace std;
//1.判断一个数N是否是素数,是的话输出“YES”,否则输出“NO”。(判断2-sqrt(N)是否存在N的因子即可)
int main()
{
    int i,num;
    int flag=0;
    scanf("%d",&num);
    for(i=2;i<sqrt(num);i++){
        if(num%i==0)
            flag=1;
    }
    if(flag==1)
        printf("YES");
    else
        printf("NO");
}
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<math.h>
using namespace std;
//题目2:在一个二维平面内有n个点,每个点坐标为(x,y),求最近的两点的距离。(暴力求解即可)
//输入:
//5
//1 2
//100 200
//1000 2000
//1000 1
//1 3
//输出:
//1
//写一个方法求两点距离
int way(int x1,int y1,int x2,int y2){
    int num;
    num=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
    return num;
}
//创建一个结构体来存对应的值
struct N{
    int x,y;
}Num[100];
int main()
{
    int i,j,n;
    int mmin=100000;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d%d",&Num[i].x,&Num[i].y);
    }
    for(i=0;i<n;i++)
    for(j=i+1;j<n;j++){
        int temp=way(Num[i].x,Num[i].y,Num[j].x,Num[j].y);
        if(temp<mmin)
            mmin=temp;
    }
    printf("%d",mmin);
}

题目3:有一个文件记录了学生期末考试的几门成绩和学号,求出这几门课程的平均分和总分,并按照总分排序,从高到底,如果成绩相同,按照学号从小到大的顺序。(

//这题最大的难点还是在于文件的读取上面:
可以参考之前https://blog.csdn.net/qq_41115379/article/details/104945792

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<math.h>
using namespace std;
//题目3:有一个文件记录了学生期末考试的几门成绩和学号,
//求出这几门课程的平均分和总分,并按照总分排序,从高到底,如果成绩相同,按照学号从小到大的顺序。(文件要用c语言的读写操作(读写操作戳这里),结构体排序可做)
//为了解决这一道题目,我们首先要解决数据问题,因为这道题的数据是有关文件的读写的,我们可以自己创建一个文件,类似于下图:
struct M{
    char name[10];
    char id[10];
    int english;
    int math;
    int yuwen;
    int kexue;
    int sum;
}stu[100];
//再写一个比较方法,用以排序
bool cmp(M a,M b){
    a.sum=a.english+a.kexue+a.math+a.yuwen;
    b.sum=b.english+b.kexue+b.math+b.yuwen;
    if(a.sum!=b.sum)
        return a.sum>b.sum;
    else
        return a.id<b.id;
}
int main()
{
    //在主函数部分读取文件
    int i;
    int c=0;
    char str[20];
    FILE *fpread=fopen("student.txt","r");
    if(fpread==NULL)
        return 0;
    for(i=0;i<6;i++)//开始读取第一列
        fscanf(fpread,"%s",str);
    //开始读取正式的内容
    while(fscanf(fpread,"%c",&stu[c].name)!=EOF){
        fscanf(fpread,"%c",&stu[c].id);
        fscanf(fpread,"%d",&stu[c].english);
        fscanf(fpread,"%d",&stu[c].math);
        fscanf(fpread,"%d",&stu[c].yuwen);
        fscanf(fpread,"%d",&stu[c].kexue);
        c++;
    }
    //再进行排序
    sort(stu,stu+c,cmp);
    //开始输出
    for(i=0;i<c;i++){
        printf("%c %c %d %d %d %d",stu[i].name,stu[i].id,stu[i].english,stu[i].math,stu[i].yuwen,stu[i].kexue);
    }
}

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

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<math.h>
using namespace std;
// 题目1:关羽过关斩三将,输入四个人的武力值(大于0小于50),若超过界限需要重新输入,关羽的武力值x,将士武力值为y,满足(x-y)^2+(x-y)+41
//若为素数则关羽获胜,若关羽三次获胜输出WIN,若失败则输出失败的将领序号(第几关)。
//写一个方法判断是否为素数
bool sushu(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()
{
    //可以用一个flag来记录第几关,赢了就加一,输了直接break
    int a[4],temp;
	int flag=1;
	for(int i=0;i<4;i++)
	{
		scanf("%d",&temp);
		if(0<temp&&temp<50)
			a[i]=temp;
		else
		{
			printf("武力值应该在0到50之间,请重新输入\n");//这个很巧妙
			i--;
		}
	}
	int i=1;
	while(i<=3){
        if(sushu((a[0]-a[i])*(a[0]-a[1])+(a[0]-a[i])+41)){//如果这个是素数的话
            flag++;
        }
        else{
            break;
        }
        i++;
	}
	if(flag>3)
        printf("WIN");
    else
        printf("%d",flag);
}

题目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<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<math.h>
using namespace std;
// 题目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
//这题是需要结构体和排序来计算的
struct P{
    char id[10];
    int s1,s2,s3;
    int x1,x2,x3;//分别是id,上班时间,下班时间
}per[100];
bool cmp1(P a,P b){
    //比谁更早,也就是上班时间最早的那个,全都换算成秒
    int suma=a.s1*3600+a.s2*60+a.s3;
    int sumb=b.s1*3600+b.s2*60+b.s3;
    return suma<sumb;
}
bool cmp2(P a,P b){
    int suma=a.x1*3600+a.x2*60+a.x3;
    int sumb=b.x1*3600+b.x2*60+b.x3;
    return suma>sumb;
}
bool cmp3(P a,P b){
    int suma=a.x1*3600+a.x2*60+a.x3-(a.s1*3600+a.s2*60+a.s3);
    int sumb=b.x1*3600+b.x2*60+b.x3-(b.s1*3600+b.s2*60+b.s3);
    return suma>sumb;
}
int main()
{
    int i,n;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%c%d%d%d%d%d%d",&per[i].id,&per[i].s1,&per[i].s2,&per[i].s3,&per[i].x1,&per[i].x2,&per[i].x3);
    }
    sort(per,per+n,cmp1);
    for(i=0;i<n;i++)
        printf("%s %02d:%02d:%02d",per[i].id,per[i].s1,per[i].s2,per[i].s3);
    sort(per,per+n,cmp2);
    for(i=0;i<n;i++)
        printf("%s %02d:%02d:%02d",per[i].id,per[i].x1,per[i].x2,per[i].x3);
    sort(per,per+n,cmp3);
    for(i=0;i<n;i++)
        printf("%s %02d:%02d:%02d",per[i].id,per[i].s1,per[i].s2,per[i].s3);
}
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<math.h>
using namespace std;
// 有一个MN的材料和一个st的模板,从材料中切除模板,求最大能切出来的模板的数量。
//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
//sample output
//:
//这道题就是用DFS来对取这块模板和不取这块模板进行全都的讨论
char Map1[100][100];//用来存材料
char Map2[100][100];//用来存模板
char temp[100][100]={'0'};//用来中间使用
int n,m,s,t,i,j;
int ans=0;//这个是存最大值
//写一个方法来判断是否能找到对应模板
bool judge(char Map[100][100],int x,int y){
    //x,y是材料的位置,而对模板来说就是对应位置
    int flag=0;
    for(i=0;i<s;i++)
    for(j=0;j<t;j++){
        if(Map2[i][j]!=Map[x+i][y+j])
            flag=1;
    }
    if(flag==1)
        return false;
    else
        return true;
}
//开始dfs
void DFS(char Map[100][100],int x,int y,int mmax){
    //先更新大小
    if(mmax>ans)
        ans=mmax;
    //再开始判断假设是从0,0开始的,而且以列为出发点,所以是第一列,然后x从0到m-1,所以当y大于等于N时,说明程序走到尽头
    if(y>=n)
        return ;
    if(x>=m)//该列走完了
        DFS(Map,0,y+1,mmax);
    else{
        //该列没走完,那先判断这位置可否切割
        if(judge(Map,x,y)){
            //如果可以的话,那就需要有两种方法了:1.一种是不管,向前推进,一种是选择这块,然后把Map变成一个新的
            for(i=0;i<m;i++)
                for(j=0;j<n;j++)
                temp[i][j]=Map[i][j];//先完全赋值
            //再进行挖空
            for(i=x;i<x+s;i++)
                for(j=y;j<y+t;j++)
                temp[i][j]='0';
            //所以有两种
            DFS(temp,x+s,y,mmax+1);//向前推进,我无语,在这个地方看了好久,才发现错误
            DFS(Map,x+1,y,mmax);


        }
        else
            DFS(Map,x+1,y,mmax);
    }

}
int main()
{
    scanf("%d%d",&m,&n);
    for(i=0;i<m;i++)
        for(j=0;j<n;j++)
        scanf("%s",&Map1[i][j]);

    scanf("%d%d",&s,&t);
    for(i=0;i<s;i++)
        for(j=0;j<t;j++)
        scanf("%s",&Map2[i][j]);

    DFS(Map1,0,0,0);
    printf("%d",ans);
}
发布了72 篇原创文章 · 获赞 5 · 访问量 2803

猜你喜欢

转载自blog.csdn.net/qq_41115379/article/details/104967369
今日推荐