2023ACM夏令营周赛题解(个人分析版)

目录

第一周周赛

1-1 时间转换输出

1-2 输出大写英文字母

1-3 新胖子公式

1-4 评委打分

1-5 史宝的字母变换

 1-6 倍数区间​编辑

第二周周赛

第一周周赛

1-1 时间转换输出

具体题目如图:

 另附代码

#include <bits/stdc++.h>
using namespace std;//本题的关键在于24小时制,先从秒开始计算能避免在事先处理24小时的问题
int n;
int main(){
  cin >> n;
  int s = n%60;//求秒
  int m = n/60%60;//剩余分钟数,对60取余以排出小时数
  int h = n/60/60%24;//核心,超出24的部分作为小时,继续对4取余其实可以求天数
  cout << h << " : " << m << " : " << s << endl;
  return 0; 
}

1-2 输出大写英文字母

题目如图: 

 另附代码如下:

#include <iostream>
using namespace std;
char ch;
bool flag;
bool mp[26]; // 用一个布尔数组来表示26个大写英文字母是否出现过
bool isok(char c) {
    // 判断字符c是否为大写英文字母,且在布尔数组中未出现过
    if (c >= 'A' && c <= 'Z' && !mp[c - 'A']) {//亮点,!mp[c - 'A']实质上就是判断是否重复
        mp[c - 'A'] = true; // 将对应的布尔值设为true,表示该字母出现过
        return true;
    }
    return false;
}
int main() {
    while ((cin >> ch) && ch != '\n') {
        if (isok(ch)) {
            cout << ch; // 输出大写英文字母
            flag = true;
        }
    }
    if (!flag) {
        cout << "Not Found"; // 如果未输出任何字母,则输出 "Not Found"
    }
    return 0;
}

这个程序利用一个布尔数组 `mp` 来记录每个大写英文字母的出现情况。它遍历输入字符串中的每个字符,如果字符是大写英文字母且在数组中未出现过,则输出该字母,并将对应的布尔值设为 `true` 表示该字母已经出现过。如果没有大写英文字母出现,则输出 "Not Found"

1-3 新胖子公式

题目 如图:

#include<iostream>
using namespace std;
int main()
{
	float weight, height;
	cin >> weight >> height;
	float result = weight / (height * height);
	printf("%.1f\n", result);
	if (int(result) > 25) {
		cout <<"PANG" << endl;
	}
	else {
		cout << "Hai Xing" << endl;
	}
	return 0;
}

这题比较基础,记住printf的表示法会比cout简单。

1-4 评委打分

题目如图:

#include <bits/stdc++.h>
using namespace std;
int main() {
    double n,sum=0;
    cin >> n;
    int scores[1001];
        int maxScore =0;
        int minScore = 10;
    for (int i = 0; i < n; i++) 
    {
        cin >> scores[i];
        sum+=scores[i];
        if (scores[i] > maxScore) 
        {
            maxScore = scores[i];
        }
        if (scores[i] < minScore) 
        {
            minScore = scores[i];
        }
    }
    double average = 0;
    average=sum-maxScore-minScore;
    average /= n-2;
    printf("%.2lf\n",average);
    return 0;
}

 注意此题答案为double,读入后sort一遍,第一位和第n位分别是最大值和最小值,求和时候就从2开始到n-1位。最后输出总分数sum除以总人数n-2,输出printf.2lf

1-5 史宝的字母变换

#include <bits/stdc++.h>
using namespace std;
signed main()
{
	string s;
	cin >> s;
	for(int i = 0;i < s.length();i ++)
	{
		char c = s[i];
		if(c >= 'A' && c <= 'Z')// c是大写字母 
		{
			if(c != 'Z') 
			c += 1;
			else //  是 Z 要特判 
			c = 'A';
		}
		else if(c >= 'a' && c <= 'z')// 小写字母 
		{
			if(c != 'a')
			{
				c -= 1;
			}
			else
			c = 'z';
		}
		cout << c;
	}
	return 0;
}

 1-6 倍数区间

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll n;
	cin>>n;
	ll i=1;
	for(i=1;i<=n;i++)
		if(n%i)  break;
	cout<<i-1<<endl;
}

首先分析n为奇数的时候,即n不能被2整除,很明显答案为1,因为相邻两个数之中必有一个偶数,而偶数不能整除奇数。

再分析n能被2整除但不能被3整除的时候,发现答案为2,因为连续三个数中必定有一个是3的倍数。

以此类推,可以发现连续的x个数中,至少有一个数能被x整除。即如果存在一个最长的倍数区间[l,r],对于1≤x≤r−l+1,区间内必有至少一个数是x的倍数。那么区间[1,r-l+1]也是一个满足题意的区间,并且拥有相同的长度,所以,只需要检查l=1的区间就足够了,找到不能整除n的最小的x,答案是x-1

第二周周赛

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值