2024SZTU_ACM新生夏令营第一次训练赛题解

难度分布

难度
Easy
D
C
B
A
Mid
E
G
Hard
F

D

题目大意

给你两个数,让你看看哪个更大

题目思路

只需要先比较大小然后用分支语句(if, else) 输出即可。

题目代码

#include<stdio.h>

int main(){

    int a, b;//题目范围只有1~1000的整数, 所以我们只需要int
    scanf("%d%d", &a, &b);
    
    //分支语句
    if(a > b){
    	printf("Bat\n");
    }else{
    	printf("Glove\n");
    }

	return 0;
}

C

题目大意

给你一个1 ~ 26的数 k, 然后让你输出26个字母表中的前k个字母。

题目思路

思路1:直接用分支语句,printf k 个语句
思路2:用循环语句来printf

题目代码

思路1:

#include<stdio.h>

int main(){

    int k;
    scanf("%d", &k);

    if(k == 1) printf("A\n");
    if(k == 2) printf("AB\n");
    if(k == 3) printf("ABC\n");
    if(k == 4) printf("ABCD\n");
    if(k == 5) printf("ABCDE\n");
    if(k == 6) printf("ABCDEF\n");
    if(k == 7) printf("ABCDEFG\n");
    if(k == 8) printf("ABCDEFGH\n");
    if(k == 9) printf("ABCDEFGHI\n");
    if(k == 10) printf("ABCDEFGHIJ\n");
    if(k == 11) printf("ABCDEFGHIJK\n");
    if(k == 12) printf("ABCDEFGHIJKL\n");
    if(k == 13) printf("ABCDEFGHIJKLM\n");
    if(k == 14) printf("ABCDEFGHIJKLMN\n");
    if(k == 15) printf("ABCDEFGHIJKLMNO\n");
    if(k == 16) printf("ABCDEFGHIJKLMNOP\n");
    if(k == 17) printf("ABCDEFGHIJKLMNOPQ\n");
    if(k == 18) printf("ABCDEFGHIJKLMNOPQR\n");
    if(k == 19) printf("ABCDEFGHIJKLMNOPQRS\n");
    if(k == 20) printf("ABCDEFGHIJKLMNOPQRST\n");
    if(k == 21) printf("ABCDEFGHIJKLMNOPQRSTU\n");
    if(k == 22) printf("ABCDEFGHIJKLMNOPQRSTUV\n");
    if(k == 23) printf("ABCDEFGHIJKLMNOPQRSTUVW\n");
    if(k == 24) printf("ABCDEFGHIJKLMNOPQRSTUVWX\n");
    if(k == 25) printf("ABCDEFGHIJKLMNOPQRSTUVWXY\n");
    if(k == 26) printf("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
    //用这种写法的同学获得艰苦奋斗奖,哈哈哈

	return 0;
}

思路2:

#include<stdio.h>

int main(){

    int k;
    scanf("%d", &k);

    for(int i = 0;i < k;i ++){//记住'A' + 0 == 'A', 所以前k个要到'A' + k - 1
    	printf("%c", 'A' + i);
    }
    printf("\n");

	return 0;
}

B

题目大意

给你一个坐标x, y, 然后再给你四个数,然后问你(x, y)对应的内个数是哪个

题目思路

直接用if else语句(本题也可以二维数组, 鉴于大部分同学还没学,就不再赘述)

题目代码

#include<stdio.h>

int main(){

    int x, y;
    scanf("%d%d", &x, &y);

    int a, b, c, d;
    scanf("%d%d%d%d", &a, &b, &c, &d);

    if(x == 1 && y == 1){
    	printf("%d\n", a);
    }
    else if(x == 1 && y == 2){
    	printf("%d\n", b);
    }
    else if(x == 2 && y == 1){
    	printf("%d\n", c);
    }
    else if(x == 2 && y == 2){
    	printf("%d\n", d);
    }

	return 0;
}

A

题目大意

给你一个数,然后有四个范围,然后看我加多少可以到下一个范围

题目思路

还是if else语句哈哈哈

题目代码

#include<stdio.h>

int main(){

	int R;
	scanf("%d", &R);

    //NOTE:一定要注意看数据范围,R >= 1 && R <= 299
	if(R <= 99){
		printf("%d\n", 100 - R);
	}
	else if(R <= 199){
		printf("%d\n", 200 - R);
	}
	else if(R <= 299){
		printf("%d\n", 300 - R);
	}

	return 0;
}

E

题目大意

给你一个t 和 p, 然后给你n个人的头发长度,每天增加1, 看第几天有至少t个人的头发的长度增加到p

题目思路

这是一道数组加排序的题,先将人的信息从大到小排序,这样只需要看第t个(下标为 t - 1)人什么时候达到p, 就是最少的时间。(小于等于0的话输出0)

NOTE: 本题会用到冒泡排序,学完数组的同学可以学一下经典排序算法冒泡排序

题目代码

#include<stdio.h>

#define N 110
int L[N];//数据范围n最大100,我们为了保险开到110

int main(){

    int n, t, p;
    scanf("%d%d%d", &n, &t, &p);

    for(int i = 0;i < n;i ++){
    	scanf("%d", &L[i]);
    }
    
    //冒泡排序
    for(int i = 0;i < n - 1;i ++){
    	for(int j = 0;j < n - 1 - i;j ++){
    		if(L[j] < L[j + 1]){
    			int t = L[j];//两位数交换
    			L[j] = L[j + 1];
    			L[j + 1] = t;
    		}
    	}
    }

    printf("%d", (t - L[p - 1] <= 0 ? 0 : t - L[p - 1]));
    //三目运算符,不懂的同学一定要去学一下

	return 0;
}

G

题目大意

给你一个n和一个洗手液m, 然后n个每次输入一个数为怪物的手,用洗衣液洗怪物的手,看依次洗能给几个完整的怪物洗手

题目思路

令cnt = 0为能完整洗完的怪物的数目
直接用循环语句,每次洗完,m减去x(怪物的手),只要m >= 0就让cnt ++.

题目代码

#include<stdio.h>

int main(){

    int n, m;
    scanf("%d%d", &n, &m);
    
    int cnt = 0;
    for(int i = 0;i < n;i ++){
    	int x;
    	scanf("%d", &x);
    	m -= x;
    	if(m >= 0) cnt ++;
    }

    printf("%d", cnt);

	return 0;
}

F

题目大意

就是从A出发,向L和R中间,以A + kM的距离种树,问可以种几棵树

题目思路

算k的计算公式如下图所示:
在这里插入图片描述
我们也可以看出L,R与A的相对位置会很影响最后的结果,所以我们分类讨论即可
第一,
在这里插入图片描述
第二,
在这里插入图片描述
第三,
在这里插入图片描述

NOTE:本题最需要注意的有两点。
第一,注意L, R这一点的位置上也是有可能有树的,所以注意加上.
第二, 可能有很多同学会用abs来弄绝对值,那么注意c语言的abs仅仅对于整数类型,针对long long类型的话要用llabs
在这里插入图片描述
在这里插入图片描述
(这个是网站cplusplus.com)

题目代码

#include<stdio.h>

typedef long long ll;
//看数据范围1e18,会爆int,所以要开long long
//typedef 就是说接下来用long long的东西都可以用ll来替代

int main(){

    ll A, M, L, R;
    scanf("%lld%lld%lld%lld", &A, &M, &L, &R);
    
    //L,R相对于A的位置会影响结果,所以进行分类讨论
    ll ans = 0;
    if(L >= A){
    	ans += ((R - A) / M);//A到R的树
    	ans -= ((L - A) / M);//A到L的树
    	if((L - A) % M == 0){//L位置的树是需要的
    		ans ++;
    	}
    	printf("%lld\n", ans);
    	return 0;
    }

    if(R <= A){
    	ans += ((A - L) / M);//A到L的树
    	ans -= ((A - R) / M);//A到R的树
    	if((A - R) % M == 0){//R位置的树是需要的
    		ans ++;
    	}
    	printf("%lld\n", ans);
    	return 0;
    }

    if(L <= A && A <= R){
    	ans += ((A - L) / M);//A到L的树
    	ans += ((R - A) / M);//A到R的树
    	ans ++; // 自己原本位置的树
    	printf("%lld\n", ans);
    	return 0;
    }

	return 0;
}

献给将要上大学的学弟学妹:
" 做你想做的事,成为你想成为的人。"
------图图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值