欢乐赛#44非官方题解
2025-04-08 06:46:28
发布于:上海
ACGO 欢乐赛#44 题解
AK
本场欢乐赛的所有题目的难度评级为:
题目编号 | 题目标题 | 难度 | 知识点 |
---|---|---|---|
T1 | O | 入门 | 输出语句 |
T2 | 行图 | 入门 | 循环判断 |
T3 | 罚时计算 | 入门 | 循环统计 |
T4 | 困难的字符串改造问题 | 普及- | 字符串应用 |
T5 | 追求更多的玫瑰花 | 入门 | if-else判断语句 |
T6 | 进制转换 | 入门 | 进制转换+基础排序 |
《O》de 题目解析
O
题目简介
找出100以内含有最多“O”的数(比如“0”有一个“O”,就是它本身,“8”有两个“O”,上面一个,下面一个)。
代码
#include <bits/stdc++.h>
using namespace std;
int main(){
cout << 88;//直接输出符合题目要求的就行
return 0;
}
《行图》de 题目解析
题目简介
使用牌结算结束后记录此牌点数。你使用牌时,若此牌点数为"行图"记录点数的约数,你摸一张牌,重复执行。
代码
#include <bits/stdc++.h>
using namespace std;
const int max_n = 1e5 + 10;
int n,a[max_n];
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> a[i];
}
int ans = 0;
int rec = -1;
for (int i = 0;i < n;i++) {
if (rec != -1) {
if (rec % a[i] == 0) {
++ans;
}
}
rec = a[i];
}
cout << ans << endl;
return 0;
}
《罚时计算》 de 题目解析
题目简介
第一次提交成功不计算罚时,错误一次罚时 20 分钟,请你计算所有人的罚时。
代码
#include <bits/stdc++.h>
using namespace std;
const int max_n = 50;
int main() {
int n, m;
cin >> n >> m;
int a[max_n] = {0};
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
int k;
cin >> k;
if (k > 1) {
a[i] += (k - 1) * 20;
}
}
}for (int i = 0; i < n; ++i) {
if (i > 0) {
cout << " ";
}cout << a[i];
}
return 0;
}
《困难的字符串改造问题》 de 题目解析
题目简介
将字符串中的所有空格依次替换为大写字母(顺序:ABCD ... XYZABC....)。
代码
#include <bits/stdc++.h>
using namespace std;
string s;
int j = 1;
void f(int x){
x = x % 26;
if(x % 26 == 0){
cout << 'Z';
return;
}
char ar = 'A';
for(int i = 1;i <= 26;i++){
if(x == i){
cout<<ar;
}else{
ar++;
}
}
}
int main(){
getline(cin,s);
for(int i = 0;i < s.size();i++){
if(s[i] != ' '){
cout << s[i];
}else{
f(j);
j++;
}
}
return 0;
}
《追求更多的玫瑰花》 de 题目解析
题目简介
读取询问的区间 [l, r],算出l,r之间的长度,如果长度是奇数,那绝对是Sad;如果是偶数,那就要判断,-1和1的数量是否各≥长度的一半,如果是就happy,否就sad。
代码
#include <bits/stdc++.h>
using namespace std;
int n,m,c1,cf1;
const int max_n = 2e5 + 10;
int main(){
cin >> n >> m;
int a[max_n];
for (int i = 0;i < n;i++) {
cin >> a[i];
(a[i] == 1)?c1++ : cf1++;
}int l,r;
while(m--){
cin >> l >> r;
int len = r - l + 1;
if(len % 2 == 1){
cout << "sad" << endl;
continue;
}else{
if(c1 >= len / 2 && cf1 >= len / 2){
cout << "happy"<< endl;
}else{
cout << "sad" << endl;
}
}
}
return 0;
}
《进制转换》 de 题目解析
题目简介
将数组中每个十进制数变成八进制数,并按“先按照 每个数 的最低位从大到小排序,如果最低位的数一样,那么就按照 每个数 进行从小到大排序”的规律排序。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll f(ll n) {//十进制转八进制
ll ans = 0;
ll i = 1;
while (n > 0) {
ans += (n % 8) * i;
n /= 8;
i *= 10;
}return ans;
}int g(ll n) {//取最低位
return n % 10;
}bool cmp(ll a,ll b) {//排序判断
int A = g(a);
int B = g(b);
if (A != B) {
return A > B;
}return a < b;
}
const int max_n = 2e5 + 10;
ll a[max_n],b[max_n];
int main() {
int n;
cin >> n;
for (int i = 0;i < n;i++) {
cin >> a[i];
b[i] = f(a[i]);
}sort(b,b + n,cmp);
for(int i = 0;i < n;i++){
cout << b[i] << " ";
}
return 0;
}
这里空空如也
有帮助,赞一个