目录
第一周周赛
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