ACGO欢乐赛#53 全题解
2025-08-03 22:00:04
发布于:日本
T1.早起
思路分析:判断小明是否迟到。周一到周五(星期1~ 5)需要7点及之前起床,周六周日(星期6~7)可以赖床。因此,如果今天是周一到周五且起床时间晚于7点,则输出
YES
(迟到),否则输出NO
。
#include<bits/stdc++.h>
using namespace std;
int a,b;
int main(){
cin>>a>>b;
if(a<=5&&b>7)cout<<"YES";
else cout<<"NO";
return 0;
}
T2.小明的期末复习
思路分析:将复习时间
d
小时转换为外星时间单位。从最小单位开始逐级转换:
- 小时数 =
d % c
- 总天数 =
d / c
- 剩余天数 =
总天数 % b
- 剩余月数 =
(总天数 / b) % a
- 年数 =
总天数 / (a*b)
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d;
int main(){
cin>>a>>b>>c>>d;
int h=d%c;
int t=d/c;
int day=t%b;
int mon=(t/b)%a;
int year=t/b/a;
cout<<year<<" "<<mon<<" "<<day<<" "<<h;
return 0;
}
T3.小明的视疲劳回文串
思路分析:不区分大小写判断回文串。遍历字符串前半部分,将对应字符转为小写后比较:
- 若
s[i]
与s[n-1-i]
的小写形式不同,则需修改(计数+1)- 当修改次数 ≤
m
时输出YES
,否则NO
#include<bits/stdc++.h>
using namespace std;
string s;
int m,c;
int main(){
cin>>s>>m;
int n=s.size();
for(int i=0;i<n/2;i++){
char a=tolower(s[i]);
char b=tolower(s[n-1-i]);
if(a!=b)c++;
}
if(c<=m)cout<<"YES";
else cout<<"NO";
return 0;
}
T4.求奇数和
思路分析:奇数和=奇+偶。寻找:
- 最大奇数(
mx1
)- 最大偶数(
mx2
)
若两者均存在,则和为最大值;否则输出-1。
#include<bits/stdc++.h>
using namespace std;
int n,mx1=-1,mx2=-1;
vector<int> a;
int main(){
cin>>n;
a.resize(n);
for(int i=0;i<n;i++) cin>>a[i];
sort(a.begin(),a.end(),greater<int>());
for(int i=0;i<n;i++){
if(a[i]%2==1&&mx1==-1) mx1=a[i];
if(a[i]%2==0&&mx2==-1) mx2=a[i];
if(mx1!=-1&&mx2!=-1) break;
}
int ans=-1;
if(mx1!=-1&&mx2!=-1) ans=mx1+mx2;
cout<<ans;
return 0;
}
T5.小明的斜线总和
思路分析:左上到右下的斜线特征:行号-列号为定值。用偏移数组
d[k]
存储斜线和(k=i-j+m-1
保证非负)。遍历所有斜线求最大和。
#include<bits/stdc++.h>
using namespace std;
int n,m,mx=-1e9;
vector<vector<int>> a;
vector<int> d;
int main(){
cin>>n>>m;
a.resize(n,vector<int>(m));
d.resize(n+m-1);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
d[i-j+m-1]+=a[i][j];
for(int k=0;k<n+m-1;k++)
if(d[k]>mx) mx=d[k];
cout<<mx;
return 0;
}
T6.小明和论坛发帖
思路分析:检查每个单词是否包含任意暴戾性子串。对每个单词
s
,遍历所有暴戾性字符串b[j]
,若s.find(b[j])
能找到子串,则标记为违禁词。
(L为平均单词长度)
(存储暴戾性字符串)
#include<bits/stdc++.h>
using namespace std;
int n,m,c;
vector<string> b;
string s;
int main(){
cin>>n>>m;
b.resize(m);
for(int i=0;i<m;i++) cin>>b[i];
for(int i=0;i<n;i++){
cin>>s;
bool f=0;
for(int j=0;j<m;j++){
if(s.find(b[j])!=string::npos){
f=1;
break;
}
}
if(f) c++;
}
cout<<c;
return 0;
}
全部评论 10
第三题可以骗到全部分数(纯娱乐)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
string s;
cin>>s>>n;
if(s=="KgxggXIK"&&n==2){
cout<<"YES";
}
else{
cout<<"NO";
}
}23小时前 来自 浙江
1哇塞,作者既然给我点赞了
23小时前 来自 浙江
1包的
23小时前 来自 浙江
1哇塞,作者又给我点赞了
1小时前 来自 浙江
0
谢谢
2天前 来自 广东
1顶
2天前 来自 日本
1顶
2天前 来自 日本
1ddd
2天前 来自 四川
1d
4小时前 来自 上海
0真把我IP当日本人整
4小时前 来自 上海
0?
1小时前 来自 浙江
0
啊,删我评论
7小时前 来自 江西
0抱歉,但是后面更帖太多,就删了
1小时前 来自 浙江
0
ddd
昨天 来自 江苏
0感谢各位的支持,感谢AC君的支持!
昨天 来自 日本
0
有帮助,赞一个