小测试总结

这次的题考察的还是看自己有没有把所有情况都考虑进去了

第一题–结构体排序

一个简单的结构体多级排序,C语言qsort,C++sort就行
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{
	int number;
	char name[10];
	int data;
} stu;//结构体 

int cmp1(const void *a,const void *b)//按照学号排序 
{
	return ((stu*)a)->number-((stu*)b)->number;
}
int cmp2(const void *a,const void *b)//按照姓名排序 
{
	if(strcmp(((stu*)a)->name,((stu*)b)->name)>0)
		return 1;
	else if(strcmp(((stu*)a)->name,((stu*)b)->name)<0)
		return -1;
	else
		return cmp1(a,b);
}
int cmp3(const void *a,const void *b)//按照成绩排序 
{
	if(((stu*)a)->data>((stu*)b)->data)
		return 1;
	else if(((stu*)a)->data<((stu*)b)->data)
		return -1;
	else
		return cmp1(a,b);
}

int main()
{
	int n,c,cnt = 0;
	while(1)
	{
		scanf("%d%d",&n,&c);
		if(n==0&&c==0)
			break;
		stu num[100010];
		for(int i = 0; i<n; i++)
		{
			scanf("%d%s%d",&(num[i].number),num[i].name,&(num[i].data));
		}
		if(c == 1)
			qsort(num,n,sizeof(num[0]),cmp1);
		else if(c == 2)
			qsort(num,n,sizeof(num[0]),cmp2);
		else
			qsort(num,n,sizeof(num[0]),cmp3);
		++cnt;
		printf("Case %d:\n",cnt);
		for(int i = 0; i<n; i++)
			printf("%06d %s %d\n",num[i].number,num[i].name,num[i].data);
	}
	return 0;
}

第二题–模拟

这个要注意细节,非法条件的判断,是否是闰年等等…
在这里插入图片描述

#include<stdio.h>
#include<string.h>
int mons[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
char ok[7][11] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday", "Saturday"};
int year,mon,day;
int Isyear(int year)//判断是否闰年 
{
	if(year%400==0||year%4==0&&year%100!=0)
		return 1;
	else
		return 0;
}
int IsLegal(int year,int mon,int day)//判断年月日是否合法 
{
	if(year<=0||year>10000||mon<1||mon>12||day<1||day>31)//判断是否超出数据范围 
		return 0;
	if(Isyear(year))//通过今年是否是闰年来修改2月的天数 
		mons[1] = 29;
	else
		mons[1] = 28;
	if(day>mons[mon-1])//判断天数是否超出当月最大天数 
		return 0;
	return 1;
}
int main()
{
	while(scanf("%d%d%d",&year,&mon,&day)!=EOF)
	{
		if(!IsLegal(year,mon,day))//不合法就输出illegal 
			printf("illegal\n");
		else
		{
			int sum = 0;//从1年1月1日到今天的总天数 
			for(int i = 1; i<year; i++)//计算从开始到去年的年份天数之和 
			{
				if(Isyear(i))//闰年加366
					sum+=366;
				else //不是闰年加365 
					sum+=365;
			}
			for(int i = 0; i<mon-1; i++)//加到今年的前一个月的天数和 
				sum += mons[i];
			sum += day;//加这个月的天数 
			printf("%s\n",ok[sum%7]);
		}
	}
	return 0;
}

第三题–栈

后缀表达式,栈的运用
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
typedef struct _Stack
{
	double val;
	struct _Stack *next;
} Stack;
typedef struct _Top
{
	Stack *top;
	int cnt;
} Top;
Top* Creat()
{
	Top *p = (Top*)malloc(sizeof(Top));
	if(!p)
		return NULL;
	p->cnt = 0;
	p->top = NULL;
	return p;
}
int Add(Top *T,double val)
{
	Stack *p = (Stack*)malloc(sizeof(Stack));
	if(!p)
		return 0;
	p->next = T->top;
	p->val = val;
	T->top = p;
	T->cnt++;
	return 1;
}
int Empty(Top *T)
{
	return !(T->cnt);
}
double Pop(Top *T)
{
	if(Empty(T))
		return 0;
	Stack *p = T->top;
	T->top = T->top->next;
	T->cnt--;
	return p->val;
}
int main()
{
	char ch[100];
	Top*T = Creat();
	double sum = 0;
	while(scanf("%s",ch)!=EOF)
	{
		int len = strlen(ch);
		if(len == 1)//判断下长度: 1长度只能是字符或者单个数字 
		{
			if(ch[0] == '+')
			{
				double right = Pop(T),left = Pop(T);
				Add(T,left+right);
			}
			else if(ch[0] == '-')
			{
				double right = Pop(T),left = Pop(T);
				Add(T,left-right);
			}
			else if(ch[0] == '*')
			{
				double right = Pop(T),left = Pop(T);
				Add(T,left*right);
			}
			else if(ch[0]=='/')
			{
				double right = Pop(T),left = Pop(T);
				Add(T,left/right);
			}
			else
			{
				double val = atof(ch);
				Add(T,val);
			}
		}
		else//大于1长度只能是数字 
		{
			double val = atof(ch);
			Add(T,val);
		}
	}
	printf("%.6lf\n", Pop(T));
}

第四题–bfs

这个很烦…最开始没看题写了dfs直接gg,然后bfs改了好久bug,思路一定要理清了才行
在这里插入图片描述

#include<stdio.h>
#include<string.h>
#include<queue>
#define MAXNUM 41000
using namespace std;
int n,m;
int Mx,My,Yx,Yy;
char map[210][210];//存放地图 
int KFC[210][210];//地图上每个人到KFC的距离初始化为最大值41000 
int book[210][210];//判断是否走过 
typedef struct
{
	int x,y,step;
} Pos;
int IsOk(int x,int y)
{
	if(x<1||x>n||y<1||y>m||map[x][y]=='#'||book[x][y]==1)
		return 0;
	return 1;
}
int main()
{
	int next[4][2] = {{0,1},{0,-1},{1,0},{-1,0}};//方向 
	while(~scanf("%d%d",&n,&m))
	{
		for(int i = 1; i<=n; i++)//初始化KFC的路径 
		{
			for(int j = 1; j<=m; j++)
				KFC[i][j] = MAXNUM;
		}
		for(int i = 1; i<=n; i++)//输入数据
		{
			for(int j = 1; j<=m; j++)
			{
				char c = getchar();
				if(c == '\n')
					c = getchar();
				map[i][j] = c;
				if(c == 'Y')
				{
					Yx = i;
					Yy = j;
				}
				else if(c == 'M')
				{
					Mx = i;
					My = j;
				}
			}
		}
		//第一个人的bfs 
		memset(book,0,sizeof(book));//初始化book 
		queue<Pos>que;
		Pos head = {Yx,Yy,0};
		book[Yx][Yy] = 1; 
		que.push(head);
		while(!que.empty())
		{
			Pos p = que.front();
			for(int i = 0; i<4; i++)
			{
				int nx = p.x + next[i][0];
				int ny = p.y + next[i][1];
				if(IsOk(nx,ny))
				{
					book[nx][ny] = 1;
					Pos tail = {nx,ny,p.step+1};
					que.push(tail);
					if(map[nx][ny] == '@')
					{
						KFC[nx][ny] = tail.step;
					}
				}
			}
			que.pop();
		}
		//第二个人的bfs 
		memset(book,0,sizeof(book));
		queue<Pos>pue;
		Pos phead = {Mx,My,0};
		book[Mx][My] = 1;
		pue.push(phead);
		while(!pue.empty())
		{
			Pos p = pue.front();
			for(int i = 0; i<4; i++)
			{
				int nx = p.x+next[i][0];
				int ny = p.y+next[i][1];
				if(IsOk(nx,ny))
				{
					book[nx][ny] = 1;
					Pos tail = {nx,ny,p.step+1};
					pue.push(tail);
					if(map[nx][ny] == '@' && KFC[nx][ny]!=MAXNUM)
					{
						KFC[nx][ny]+=tail.step;
					}
				}
			}
			pue.pop();
		}
		//最后总的计算最小的路径 
		int min = MAXNUM;
		for(int i = 1;i<=n;i++)
		{
			for(int j = 1;j<=m;j++)
			{
				if(KFC[i][j]!=MAXNUM)
				{
					min = min<KFC[i][j]?min:KFC[i][j];
				}
			}
		}
		printf("%d\n",min*11);
	}
}

第五题–贪心

就是个简单的贪心…我还想用dfs…人傻了
在这里插入图片描述

#include<stdio.h>
#include<string.h>
int d;//天数 
int mintime[31];//最小的时间 
int maxtime[31];//最大的时间 
int sumtime;//要求的总时间 
int time[32];//记录每天的时间 
int main()
{
	scanf("%d%d",&d,&sumtime);
	int minsumtime = 0,maxsumtime = 0;//最小总时间和 最大总时间和 
	for(int i = 0; i<d; i++)
	{
		scanf("%d%d",&mintime[i],&maxtime[i]);
		time[i] = mintime[i];
		minsumtime+=mintime[i];
		maxsumtime+=maxtime[i];
	}
	if(minsumtime>sumtime||maxsumtime<sumtime)//如果最小时间和 都大于 要求时间 或者 最大时间和 都不够 要求时间就gg 
		printf("NO\n");
	else//那么就一定存在方式成立 
	{
		for(int i = 0; i<d; i++)
		{
			while(minsumtime!=sumtime&&time[i]<maxtime[i])//从第一个的从最小时间往上加一直到最后一个 
			{
				time[i]++;
				minsumtime++;
			}
			if(minsumtime==sumtime)
				break;
		}
		printf("YES\n");
		for(int i = 0; i<d; i++)
			printf("%d ",time[i]);
	}
	return 0;
}

太菜了…好好努力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值