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

难度分布

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

D

题目大意

给你一个数,输出它在ASCII表的字符。

题目思路

直接输出即可

题目代码

#include<stdio.h>

int main(){
    
    int n;
	scanf("%d", &n);

	printf("%c\n", n);

	return 0;
}

E

题目大意

在这里插入图片描述

题目思路

题目怎么说,你怎么做就行

题目代码

#include<stdio.h>

int main(){
    
    int N, S, K;
    scanf("%d%d%d", &N, &S, &K);
    
    int sum = 0;
    for(int i = 0;i < N;i ++){
    	int p, q;
    	scanf("%d%d", &p, &q);
    	sum += (p * q);
    }

    if(sum >= S){
    	printf("%d\n", sum);
    }else{
    	printf("%d\n", sum + K);
    }
    
	return 0;
}

B

题目大意

车辆开始的人是不确定的,给你n个数,正数是上车, 负数是下车,问你最后有多少人?

题目思路

本题最关键的是中间车辆不可能有负数个人,为了不让有负数个人,提高初始的人,初始的人就是每次导致中间车辆负数个人的绝对值的和。
同时记得一定要开long long

题目代码

#include<stdio.h>

#define N 200005
typedef long long ll;
//注意本题a[i]最大为1e9,同时n为2e5,所以2e14是会爆int的要开long long

ll a[N];

int main(){

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

	for(int i = 0;i < n;i ++){
		scanf("%lld", &a[i]);
	}

	ll sum = 0;//记得开long long 
	for(int i = 0;i < n;i ++){
		sum += a[i];
		if(sum < 0) sum = 0;//车上的人肯定不可能为负数
	}

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

	return 0;
}

C

题目大意

给你三个顶点的坐标,然后问你这三个顶点可不可以组成一个直角三角形

题目思路

思路一 : 直接用勾股定理,记住不要先sqrt再平方,会造成精度问题
思路二(推荐): 用向量,向量相乘等于0就代表垂直,为什么推荐思路二,是因为比如你算面积之类的时候向量就会很方便也不会造成精度问题。

题目代码

思路一:

#include<stdio.h>

int main(){
    
    int xa, ya, xb, yb, xc, yc;
    scanf("%d%d%d%d%d%d", &xa, &ya, &xb, &yb, &xc, &yc);
 
    int x = (xa - xb) * (xa - xb) + (ya - yb) * (ya - yb);
    int y = (xa - xc) * (xa - xc) + (ya - yc) * (ya - yc);
    int z = (xb - xc) * (xb - xc) + (yb - yc) * (yb - yc);

    if((x + y == z) || (x + z == y) || (z + y == x)){
    	printf("Yes\n");
    }else{
    	printf("No\n");
    }

	return 0;
}

思路二:

#include<stdio.h>

int main(){
    
    int xa, ya, xb, yb, xc, yc;
    scanf("%d%d%d%d%d%d", &xa, &ya, &xb, &yb, &xc, &yc);
 
    int x1 = xa - xb, y1 = ya - yb;
    int x2 = xa - xc, y2 = ya - yc;
    int x3 = xb - xc, y3 = yb - yc;

    if((x1 * x2 + y1 * y2 == 0) || (x1 * x3 + y1 * y3 == 0) || (x2 * x3 + y2 * y3 == 0)){
    	printf("Yes\n");
    }else{
    	printf("No\n");
    }

	return 0;
}

G

题目大意

在这里插入图片描述

题目思路

跟着题目走就行

题目代码

#include<stdio.h>

int main(){
    
    int k, g, m;
    scanf("%d%d%d", &k, &g, &m);
    
    int a = 0, b = 0;
    while(k --){

    	if(b == 0 && a != g){//注意a为g先倒掉
    		b = m;
    		continue;
    	}

    	if(a == g){
    		a = 0;
    		continue;
    	}

    	if(b){
    		a += b;
    		b = 0;
    		if(a > g){
    			b = (a - g);
    			a = g; 
    		}
    	}
    	
    }

    printf("%d %d\n", a, b);
    
	return 0;
}

A

题目大意

在这里插入图片描述

题目思路

这题我们可以用五进制的思路,然后在最后的时候乘以2, 但是因为五进制是从0开始所以最后要减去2。

NOTE: 如果 428000000 要变成 426888888,同时要用long long

题目代码

#include<stdio.h>

#define N 100
typedef long long ll;
ll a[N];

int main(){
    
    ll n;
    scanf("%lld", &n);
    
    int k = 0;
    ll res = 0;
    while(n){
        a[k ++] = (n % 5);
        n /= 5;  	   
    }
    
    int cnt = 0; 
    while(a[cnt] == 0) a[cnt ++] = 4;//特判末尾所有的0
    a[cnt] -= 1;

    ll ans = 0;
    for(int i = k - 1;i >= 0;i --){//倒着循环得到答案
    	ans = ans * 10 + a[i] * 2;
    }

    printf("%lld\n", ans);
    
	return 0;
}

F

题目大意

在这里插入图片描述

题目思路

看代码注解

题目代码

#include<stdio.h>
#include<math.h>

#define MAXN 10
char s[MAXN][MAXN];

int main(){
    
    int N;
    scanf("%d", &N);

    int n = (int)pow(3, N);
    for(int i = 1;i <= n;i ++){
        for(int j = 1;j <= n;j ++){
            s[i][j] = '#';
        }
    }

    for(int k = N;k >= 1;k --){
    //枚举k的大小,先弄大的后弄小的
        int g = (int)pow(3, k - 1);
        for(int i = g + 1;i <= n;i += g * 3){
        //i和j循环, i和j是要放'.'的左上角位置
            for(int j = g + 1;j <= n;j += g * 3){
                for(int u = i;u < i + g && u <= n;u ++){
                //u和v是从左上角位置开始循环放'.'
                    for(int v = j;v < j + g && v <= n;v ++){
                        s[u][v] = '.';
                    }
                }
            }
        }
    }

    for(int i = 1;i <= n;i ++){
        for(int j = 1;j <= n;j ++){
            printf("%c", s[i][j]);
        }
        printf("\n");
    }
    
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值