#创作计划#欢乐赛52题解
2025-07-29 09:56:34
发布于:浙江
放透视-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@AC君,这是本人第一次写题解(真的吗),希望给一个加精。
现在欢乐赛进化成这种程度了吗,好不容易AK一个欢乐赛,结果就因为吃了亿点点罚时给我干到200多名了,zao
先报个人难度:
题目 | 难度 |
---|---|
T1 | 红 |
T2 | 红 |
T3 | 红 |
T4 | 红,上位 |
T5 | 红 |
T6 | 红 |
T1
不难看出,只要 三个数中有两个及以上的数是符合题目要求的,那么就直接输出YES:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cin >> a >> b >> c;
int m=(a==1)+(b==2)+(c==3);
cout << (m>=2?"YES":"NO");
return 0;
}
时间复杂度:,空间复杂度:
T2
本题可以这么想:要获得最少修改次数,每一个 加1的次数自然也要少。那么只有当 和 相等的时候,才可以既满足条件又获得了最少的操作次数。所以我们定义一个变量num来统计我们需要改变的数量:每当前面的数大于其后边的数时,我们就将num加上这两个数差的绝对值。最后不要忘记将 的值赋值给
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main(){
int a,num=0;
cin >> a;
int sz[1000005]={};
for(int i=1;i<=a;i++){
cin >> sz[i];
}for(int i=2;i<=a;i++){
if(sz[i-1]>sz[i]){
num+=sz[i-1]-sz[i];
sz[i]=sz[i-1];
}
}cout << num;
return 0;
}
时间复杂度:由于我们只进行了一次从2到a的循环,所以我们的时间复杂度就是 ,空间复杂度:
T3
题目说:忽略大小写的情况下,那么我们只需要将两个字符串都转为大写或小写,之后进行判等即可(某位用py做的,,早知道我py多学一点了,z)这里注意用使用getline进行输入:
#include <bits/stdc++.h>
using namespace std;
int main(){
string a,b;
getline(cin,a);
getline(cin,b);
for(int i=0;i<=a.size()-1;i++){
if(a[i]>='a' and a[i]<='z' or a[i]==' ')continue;
else{
a[i]-=('A'-'a');
}
}for(int i=0;i<=b.size()-1;i++){
if(b[i]>='a' and b[i]<='z' or b[i]==' ')continue;
else{
b[i]+=('a'-'A');
}
}if(a==b){
cout << "YES";
}else cout << "NO";
return 0;
}
时间复杂度: 我们只进行了一个 的和 的字符串转换操作,复杂度显而易见,为 ,空间复杂度:
T4:
典型的贪心策略,我们优先去那张为4的卡牌,4的那完了我们就那3的,以此类推,直到卡牌拿完或达到选取的数量为止:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b,c,d,e;
cin >> a >> b >> c >> d >> e;
int num=0;
if(e>=d){
e-=d;
num+=d*4;
}else{
cout << e*4+num;
return 0;
}if(e>=c){
e-=c;
num+=c*3;
}else{
cout << e*3+num;
return 0;
}if(e>=b){
e-=b;
num+=b*2;
}else{
cout << num+e*2;
return 0;
}cout << num+e;
return 0;
}
时间复杂度:显然是,空间复杂度:
T5:
本题可以使用暴力破解法(某位大佬用了字符串哈希也是可以的),因为数据较少,完全不用担心TLE:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int a[1005][1005]={},b[3][3]={};
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
cin>>b[i][j];
for(int i=1;i<=n-2;i++){
for(int j=1;j<=m-2;j++){
bool bl=true;
for(int k=0;k<3;k++){
for(int l=0;l<3;l++){
if(a[i+k][j+l]!=b[k][l]){
bl=false;
break;
}
}
if(!bl)break;
}
if(bl){
cout<<"YES";
return 0;
}
}
}
cout<<"NO";
return 0;
}
时间复杂度:,空间复杂度:
T6:
板子题,直接从小码王递归里边复制,然后稍加修改,让它返回字符串即可:
#include <bits/stdc++.h>
using namespace std;
string m(int a, int b, string s=""){
if(a==0){
if(s.size()==0) return "0";
return s;
}
s = m(a/b, b, s);
int r = a%b;
if(r>9){
s+=char(r+'A'-10);
} else {
s+=char(r+'0');
}
return s;
}
int main(){
int a, b, r;
cin >> a >> b >> r;
string a_str = m(a,r);
string b_str = m(b,r);
if(a_str>b_str) {
for(int i=1;i<=a_str.size()-1;i++)cout << a_str[i];
} else {
for(int i=1;i<=b_str.size()-1;i++)cout << b_str[i];
}
return 0;
}
时间复杂度:,这里的 以 为底。空间复杂度:
最后,特别鸣谢@AAA混泥土批发ppl哥指出本帖的错误,%%%。
全部评论 16
帮顶
2025-07-29 来自 浙江
1帮顶
2025-07-29 来自 浙江
1帮顶
2025-07-29 来自 浙江
1帮顶
2025-07-28 来自 浙江
1帮顶
2025-07-28 来自 浙江
1帮顶
2025-07-28 来自 浙江
1帮顶
2025-07-28 来自 浙江
1帮顶
2025-07-28 来自 浙江
1帮顶
2025-07-28 来自 浙江
1内个每个“空间复杂度”前的逗号要改为中文逗号,不能用英文逗号,还有字符串 s 的长度应用|s|表示,而不是s.size,望修正
2025-07-28 来自 浙江
1OK,感谢大佬
2025-07-28 来自 浙江
1
%%%
2025-07-28 来自 浙江
1d
2025-07-29 来自 浙江
02025-07-28 来自 浙江
0ddd
2025-07-28 来自 浙江
0666
2025-07-26 来自 浙江
0%%%
2025-07-26 来自 湖南
0%%%
2025-07-27 来自 浙江
0
有帮助,赞一个