HAUTOJ 2021新生周赛(一)zjy专场题解

卷卷签到成功

直接输出即可

#include<stdio.h>

int main(){
	printf(">>签到成功<<"); 
	return 0;
} 

卷卷的空间限制

由题目条件可知:1MB可以储存1024 * 1024 / 4 = 262144个int类型整数。

#include<stdio.h>

int main(){
	int n;
	scanf("%d", &n);
	// 直接计算并输出即可 
	printf("%d", n * (1024 * 1024 / 4)); 
	return 0;
} 

卷卷的石子

每人每次必须拿走一个,则奇数个石子先手胜,偶数个石子后手胜。

注意:输出'%'时,需要使用'%%'。

#include<stdio.h>

int main(){
	int n;
	scanf("%d", &n);
	
	//因为每次必须拿一个,所以判断奇数偶数即可 
	if(n%2==0){
		printf("聚聚NB");
	}
	else{
		//输出"%",需要用"%%" 
		printf("%%%%%%聚聚");
	}
	return 0;
} 

卷卷今天休息(?)

总做题数 = 总时间 / 做一道题需要的时间

#include<stdio.h>

int main(){
	int a, b, c, x, y, z, m;
	scanf("%d:%d:%d", &x, &y, &z);
	scanf("%d:%d:%d", &a, &b, &c);
	scanf("%d", &m); 
	//计算总秒数 
	int sum = (a - x) * 3600 + (b - y) * 60 + (c - z);
	//答案=总秒数 / 通过一道题需要的秒数 
	int ans = sum / m;
	printf("%d", ans); 
	return 0;
} 

聚聚的小游戏

循环输入,统计四种字符的出现次数。 W的数量和S相等且A的数量和D相等时输出YES,否则输出NO。

注意变量的初始化和行末换行字符的控制

#include<stdio.h>

int main(){
	int w = 0, a = 0, s = 0, d = 0; // 统计WASD的出现次数 
	int n, i;
	char op;
	scanf("%d%*c", &n); // 使用%*c吃掉行末换行 
	for(i = 1; i <= n; i++){
		scanf("%c", &op);
		
		// 统计各种字符出现次数 
		if(op == 'W') w++;
		else if(op == 'A') a++;
		else if(op == 'S') s++;
		else if(op == 'D') d++;
	}
	// 如果上下次数相等 且 左右次数相等,停在原点 
	if(w == s && a == d) printf("YES");
	else printf("NO");
	return 0;
} 

聚聚的幸运数字

每一个1都可以选择删或不删,共有232^323种,排除自身后满足条件的只有 7 种情况

即:5499、 51499、 54199、 54919、 514199、 514919、 541919

#include<stdio.h>

int main(){
	int n;
	scanf("%d", &n); 
	if(n == 5499 || n == 51499 || n == 54199 || n == 54919 || n == 514199 || n == 514919 || n == 541919)
		printf("YES");
	else printf("NO");
    return 0;
}

聚聚的子串

首先考虑子串长度为1的情况。这类子串就是a~e 的字符。那么出现次数最多的子串就是出现次数最多的字符。

接下来考虑子串长度为2的情况。这类子串一定由某一字符(长度为1的子串)加一个新字符组成。因此,这种子串的出现一次一定小于等于第一类子串的出现次数。例如:串 abab中,ab 是一个这类子串。而 a 出现的次数一定不会比 ab 出现次数少。

因此,我们的思路是:单个字符的子串中出现次数最多的一定是所有子串中出现次数最多的。统计出现的字母的数量即可,最大值即为答案。

#include<stdio.h>
int main(){
	int a = 0, b = 0, c = 0, d = 0, e = 0; //分别用来存储 5 个字符出现的次数
	int n, i;
	char ch;
	scanf("%d%*c", &n); // %*c用来吃掉行末空格,也可以用 getchar(); 
	for(i = 1; i <= n; i++){
		scanf("%c", &ch);
		
		//统计字符出现次数 
		if(ch == 'a') a++;
		else if(ch == 'b') b++;
		else if(ch == 'c') c++;
		else if(ch == 'd') d++;
		else if(ch == 'e') e++;
	}
	//找到出现次数的最大值 
	int max = a;
	if(b > max) max = b;
	if(c > max) max = c;
	if(d > max) max = d;
	if(e > max) max = e;
	
	printf("%d", max);
	return 0;
} 

聚聚的Rating目标

举几个例子:

1234的下一个目标是2000

((1234 / 1000) + 1) * 1000 = 2000

20的下一个目标是30

((20 / 10) + 1) * 10 = 30

因此,下一个Rating目标=当前数字的最高位上的数+1,其余各位变成0

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

int main(){
    int rat, r, ans, k, t = 0;
    
    scanf("%d", &rat);
    r = rat;
    
    //求位数
    while(rat){ 
        t++;
        rat = rat / 10;
    }
	
	//求出10的(长度-1)次方 
    k = pow(10, t - 1);

	
	//求出结果
	ans = ((r / k) + 1) * k - r; 

    printf("%d", ans);
    
    return 0;
}