这次的题考察的还是看自己有没有把所有情况都考虑进去了
第一题–结构体排序
一个简单的结构体多级排序,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;
}
太菜了…好好努力!