#创作计划#欢乐赛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
帮顶
2天前 来自 浙江
1帮顶
2天前 来自 浙江
1帮顶
2天前 来自 浙江
1帮顶
3天前 来自 浙江
1帮顶
3天前 来自 浙江
1帮顶
3天前 来自 浙江
1帮顶
3天前 来自 浙江
1帮顶
3天前 来自 浙江
1帮顶
3天前 来自 浙江
1内个每个“空间复杂度”前的逗号要改为中文逗号,不能用英文逗号,还有字符串 s 的长度应用|s|表示,而不是s.size,望修正
3天前 来自 浙江
1OK,感谢大佬
3天前 来自 浙江
1
%%%
3天前 来自 浙江
1d
2天前 来自 浙江
03天前 来自 浙江
0ddd
3天前 来自 浙江
0666
5天前 来自 浙江
0%%%
5天前 来自 湖南
0%%%
4天前 来自 浙江
0
有帮助,赞一个