18新生联考题解

A.上去揍ta ~_~(由某acm队员的渗透一班zj)

题目描述

wbt从小就喜欢看金庸老师的作品,不久前金庸老师逝世,享年九十四岁,在得知这个消息之后,wbt心痛不已,并且对生命有了一些思考,他想知道他还可以活多少天,输入一个日期,表示假设他离开人世的时间,今天是2018年11月9日,请计算他还可以活多少天 

 

输入

输入一个日期,包括三个数 ,年 y,月 m,日d 
(2018<=y<9999, 0<m<=12,0<d<=31 且 输入的该日期在2018年11月9日之后)

 

输出

输出一个整数,表示她还可以活多少天

样例输入

2018 11 11

样例输出

2

这道题是比赛第一题,对一些有代码基础的人来说算是比较简单,没有坑点,下面是AC代码

#include <stdio.h>
#include <string.h>
int main()
{
    char qwq[1001],qaq[1001];//由题可知字符串长度小于1000,习惯原因我这里稍开大一些
    int i,numqwq = 0,numqaq = 0;
    gets( qwq );
    gets( qaq );//由样例可知输入中带有空格字符,所以选择用gets函数
    int lenqwq = strlen( qwq );
    int lenqaq = strlen( qaq );//这里strlen函数的作用是求字符串长度,需要头文件string.h
    for( i = 0 ; i < lenqwq ; i++)
    {
        if( qwq[i] == 'W' || qwq[i] == 'w')
        {
            numqwq++;
        }
    }
    for( i = 0 ; i < lenqaq ; i++)//这两个for循环遍历数组,寻找其中W与w的个数
    {
        if( qaq[i] == 'W' || qaq[i] == 'w')
        {
            numqaq++;
        }
    }
    if( numqwq >= numqaq )//题目中有这样一句话“如果gxd歌名里w或W的数量较多或等于老媪歌名中的数量”
    {
        printf("I'm the best\n");
    }
    else
    {
        printf("You take me to the hospital\n");
    }
    return 0;
}

B.非自然死亡(由某位不愿意透露姓名的软设一班WPM友情提供)

题目描述

gxd今天去府衙逛街,在公交车上他遇见了一老媪,老媪睡着了,当她醒来发现坐过站了之后立即要求司机停车,但是公交公司规定正常情况下不到站牌是不可以停车开门的,可老媪非要司机停车,还扯司机的方向盘,用手机打司机的头,gxd看到了,从内心涌上一股恐惧感,感觉自己再不有所行动可能就要坠入死亡的深渊了,然后他二话不说一个跨步飞上去就把老媪拉过来了......左勾拳,右勾拳,无影腿一顿暴打,打的老媪哭爹喊娘,于是乎gxd就跟老媪约定,两个人每人说一首英文歌名,谁的歌名里包含的‘w’(包含大小写)字符比较多,谁就胜,如果gxd胜了,老媪就要向全车的人道歉,并向司机赔偿精神损失费,如果老媪胜了,gxd就要带老媪去医院包扎伤口(老媪被gxd打的跪地上起不来),现在请你来评判一下他们谁胜。

输入

输入两个字符串分别是gxd的歌名,老媪的歌名(字符串长度小于1000) 

 

输出

如果gxd歌名里w或W的数量较多或等于老媪歌名中的数量,输出 I'm the best
否则,输出 You take me to the hospital

样例输入

Welcome to NewYork
Way Back Home

样例输出

I'm the best

//思路:用结构体把 体重(kg),身高(cm),血糖浓度(mmol/L)保存起来,然后对 血糖浓度进行排序,然后输出对应血糖浓度的体重即可。

//方法一:用sort排序,如果不会sort可以看看方法二

#include<iostream>
#include<algorithm> //sort对应的头文件 
using namespace std;
struct qq //定义结构体 
{
    int a,b;
    double c;
}D[1000];
bool cmp(qq a,qq b)
{
    return a.c<b.c;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=0;i<t;i++)
    {
        scanf("%d %d %lf",&D[i].a,&D[i].b,&D[i].c);
    }
    sort(D,D+t,cmp);  //sort排序 
    printf("%d",D[0].a);  //sort排序默认从小到大,第一个为最小值 输出最小血糖浓度对应的体重
    return 0; 
}

//方法二:用冒泡进行排序

#include<iostream>
using namespace std;
struct qq //定义结构体 
{
    int a,b;
    double c;
}D[1000];
bool cmp(qq a,qq b)
{
    return a.c<b.c;
}
int main()
{
    int t;
    scanf("%d",&t);
    for(int i=0;i<t;i++)
    {
        scanf("%d %d %lf",&D[i].a,&D[i].b,&D[i].c);
    }
    for(int i=0;i<t-1;i++)  //冒泡排序 
    {
    	for(int j=0;j<t-1-i;j++)
    	{
    		if(D[j].c>D[j+1].c)  //从小到大进行排序 
			{
				struct qq t=D[j];        //交换 
				D[j]=D[j+1];
				D[j+1]=t;
			}   
		}
	}
    printf("%d",D[0].a); // 排序位从小到大,第一个为最小值,输出最小血糖浓度对应的体重
    return 0;
}

C.活多少天?(由某acm队员wbt提供)

题目描述

三澄美琴是UDI研究所的一名专门探查死者死因的解剖医生 
今天是周五,她所要做的就是对最近一起案件的所有死者生命特征进行记录并且排序 
她需要记录死者的体重(kg),身高(cm),血糖浓度(mmol/L) 
现在请你根据他所记录的信息寻找出血糖浓度最低的死者的体重是多少

输入

首先输入一个整数n,代表需要记录的死者人数(1<n<1000) 
接下来每一行输入三个数,分别代表死者的体重W(kg),身高H(cm),血糖浓度G(mmol/L) 
体重身高均为整数,血糖浓度精确到0.01 

输出

输出所求的体重

样例输入

3
58 176 5.2
42 160 4.2
45 165 4.8

样例输出

42
#include<stdio.h>
int main()
{
    int a,b,c,d,g,h,n,qwq;
    int e[12]= {31,29,31,30,31,30,31,31,30,31,30,31};//闰年数组,代表每月的天数
    int f[12]= {31,28,31,30,31,30,31,31,30,31,30,31};//平年数字,代表每月的天数
        scanf("%d%d%d",&a,&b,&c);
        g=0;//答案天数
        qwq=a;//最后那一年
        for(int i=2018;i<a;i++)//开始计算天数
        {
            if((i%4==0&&i%100!=0)||i%400==0)//判断闰年
            {
                g=g+366;
            }
            else
            {
                g=g+365;
            }
        }
        if((a%4==0&&a%100!=0)||a%400==0)//判断闰年
        {
            for(d=0; d<b-1; d++)//b-1算到上一个月份
            {
                g=e[d]+g;
            }
            g=g+c;          //加上本月的天数
        }
        else
        {
            for(d=0; d<b-1; d++)
            {
                g=f[d]+g;
            }
            g=g+c;
        }
        printf("%d\n",g-313);//到11月9号为313天,减去多算的天数
    return 0;
}

D,博弈棋

题目描述

现在给你一个N*N的棋盘,只有两颗棋子,黑王和白王,之后白王在(1,1)的位置,黑王在(nn)的位置,他们可以向上下左右斜上斜下8个位置,也就是说如果一个棋子在(a,b)位置那么他可以到达的地方是 (a+1,b), (a−1,b), (a,b+1), (a,b−1), (a+1,b−1), (a+1,b+1), (a−1,b−1), 和, (a−1,b+1),现在两颗棋子轮流走,白棋先走,给你他们想要争夺的位置(x,y),你能告诉我们谁最先到达预定位置吗? 

输入

单组测试样例,给你一个 n (2<= n <= 10^18) ,表示棋盘位置,之后给你两个数x,y表示的是要争夺的地点。(1≤x,y≤n) 

输出

如果白先到输出White , 否则输出 Black 

样例输入

4
2 3
5
3 5
2
2 2

样例输出

White
Black
Black

提示

 
第一组样例:

 白棋(2,2) ->黑棋(3,3),->白旗(2,3) 白棋胜利 


 
第二组样例:白棋(2,2) - >黑棋 (4,4) -> 白棋(3,3)->黑棋(3,5)黑赢 


第三组样例

黑棋直接在(2,2)黑赢 

解法一,由某acm队员mjz友情提供。
#include<stdio.h>
int main()
{
	long long int a,b,n;
	while(scanf("%lld",&n)!=EOF)//多组输入输出表示,考试时所用试题为单组输入输出,此处了解即可
	{
		scanf("%lld %lld",&a,&b);
		if(a + b <= n + 1)
		{
			printf("White\n");//如果给定的坐标与两点间的垂直平分线重合或者再垂直平分线的靠近白棋的半边,则白棋获胜; 
		}
		else
		{
			printf("Black\n");//否则黑棋获胜; 
		}
	}
}/*如图所示,白色方块表示白棋能获胜的坐标,黑色方块表示黑棋能获胜的坐标,显然当a+b <= n + 1时,白棋获得胜利;*/

解法二

由某acm队员wbt提供

思路:由于棋子走向一次可以直接进行横向移动一格,纵向移动一格或者斜向移动一格,所以用终点坐标减去起始坐标,较大值即是移动所需步数

#include<stdio.h>
int main()
{
		long long int a,b,n;
		while(scanf("%lld",&n)!=EOF)//多组输入输出表示,考试时所用试题为单组输入输出,此处了解即可
		{
			scanf("%lld %lld",&a,&b);
			long long int ans1, ans2;
			ans1=(a-1>=b-1)?a-1:b-1;//白棋移动步数
			ans2=(n-a>=n-b)?n-a:n-b;//黑棋移动步数
			if(ans1<=ans2)
			printf("White\n");
			else
			printf("Black\n");
		}
} 

//E.爬楼梯那个爬楼梯 ——nEo.(由某acm队员lz提供)

题目描述

临近新生测试了,LZ想去ACM找学长问问题,但是他首先要爬上一栋多层楼的楼梯。每当LZ爬上楼梯,他就从1开始,数到这层楼梯上的台阶数。他把每一个数字都大声说出来。例如,如果他爬上两层的楼梯,第一层楼梯有4个台阶,第二层楼梯有6个台阶,他将宣布数字1,2,3,4,1,2,3,4,5,6 。你得到了所有LZ读出来的数字。你要求出他爬了多少楼梯?同时,输出每层楼梯的楼梯数量。给定的序列是小阿花攀登一层或多层楼梯时读出的有效序列。

输入

第一行输入一个整数n,表示LZ爬的所有楼梯数目(1<=n<=10000) 
接下来一行输入一个序列,表示LZ读出来的数字序列 

 

输出

第一行输出LuoZhuang爬上的楼梯层数 
第二行输出每层楼梯的数目 

 

样例输入

7
1 2 3 1 2 3 4

样例输出

2
3 4
#include<stdio.h>
int main()
{
int n,sum = 0,a[10000];
scanf("%d",&n);
for(int i = 0;i < n;i++)
{
scanf("%d",&a[i]);  //按照题意输入
if(a[i] == 1) sum++; // 有题目可知 主人公每次都是从1开始 所以有几个1就代表上了几层
}

printf("%d\n",sum);

for(int i = 0;i < n;i++)
{
if(a[i] == 1 && i != 0)  //这里 按照题意输出 数字1的前一个数即可 并且 这个数字不是第一个
{
printf("%d ",a[i-1]);
}
}
printf("%d",a[n-1]); // 这里 很多人交上去了发现格式错误  就是你们的最后一个数字多了一个空格
return 0;            // 所以我把它自己单独输出 即可
}

F这是一道签到题

由某acm队员wbt提供

题目描述

ax + by = c; 
给你c,x, y,问是否存在非负整数a和b使得式子成立。 
如果存在输出YES,并且输出a和b。 
如果不存在输出NO; 
 

输入

第一行输入一个非负整数c (1≤ c ≤ 10 000 000) 
第二行输入一个非负整数a (1≤ a ≤ 10 000 000) 
第三行输入一个非负整数b (1≤ b ≤ 10 000 000)
 

输出

第一行输出YES或NO表示是否存在答案。 
如果存在答案,在第二行输出a和b, 如果存在多组答案,输出a最小的那一组; 

样例输入

7
2
3

100
25
10

15
4
8

9960594
2551
2557

样例输出

YES
2 1
YES
0 10
NO
YES
1951 1949

思路:我们可以知道c=ax+by,进行变换得到x=(c-by)/a,求最小的x即是by最大即可

#include<stdio.h>
int main()
{
	int a,b,c,ans;
	while(scanf("%d %d %d",&c,&a,&b)!=EOF)//多组输入输出表示,考试时所用试题为单组输入输出,此处了解即可

	{
		int t=c/b;//求出最大的y的倍数
		int flag=0;
		for(int i=t;i>=0;i--)//由最大依次减小,如果除a无余数,此时即是最小的x值
		{
			if((c-i*b)%a==0)
			{
				ans=i;
				flag=1;//判断此时有最小解
				break;
			}
		}
		if(flag==1)
		{
			printf("YES\n");
			printf("%d %d\n",(c-ans*b)/a,ans);
		}
		else
		printf("NO\n");	
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/QGDUUEHGJKNHBFJHJBVG/article/details/83962479
今日推荐