欢乐赛#34题解
2024-11-18 18:12:44
发布于:广东
(这是我发的第二个赛事题解了,希望大家支持)。
由于本次欢乐赛顺序比较佛系(最后一题竟然送分),所以讲解顺序是先易后难。
T6:
不用讲了吧,是个人都会。
代码:
print("Good Luck!")
T1:
这题我的做法是桶,先统记再判断,代码如下:
#include<bits/stdc++.h>
using namespace std;
int d[100005];
int main(){
int n,sum = 0;
cin >> n;
for(int i = 0;i < n;i ++){
int x;
cin >> x;
d[x] ++;//统计
}
for(int i = 0;i <= 100000;i ++){
if(d[i]) sum ++;//判断
}
cout << sum;
return 0;
}
T2:
这题我是把dx、dy数组用map存起来,再模拟。
代码如下:
#include<bits/stdc++.h>
using namespace std;
map<char,int> dx;
map<char,int> dy;
int main(){
dy['D'] = -1;//初始化dx、dy
dy['U'] = 1;
dx['R'] = 1;
dx['L'] = -1;
int n;
cin >> n;
string s;
cin >> s;
int x = 0,y = 0;
for(int i = 0;i < s.size();i ++){
y += dy[s[i]];//更新
x += dx[s[i]];
}
printf("(%d,%d)",x,y);
return 0;
}
T4:
和欢乐赛33#的T4一样,许多人不能AC的原因是在判断质数这方面判断到sqrt(n)就可以了,不然会TLE。
代码如下:
#include<bits/stdc++.h>
using namespace std;
bool is_prime(int x){
if(x < 2) return 0;
for(int i = 2;i * i <= x;i ++){//优化
if(x % i == 0){
return 0;
}
}
return 1;
}
int main(){
int n,sum = 0;
cin >> n;
for(int i = 2;i <= n;i ++){
if(is_prime(i)){//如果是质数就++
sum ++;
}
}
cout << sum;
return 0;
}
T5:
这题我还是用桶来存,挨个判断(真可恶,本来能上前五的,结果一开始没有memset断送的我的霸业)。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int d1[200],d2[200];
int main(){
int t;
cin >> t;
while(t --){
memset(d1,0,sizeof d1);
memset(d2,0,sizeof d2);//记得memset!!!!!!!!!!!!!!!!!!!
int n;
cin >> n;
string a,b;
cin >> a >> b;
for(int i = 0;i < n;i ++){//用桶计数
d1[a[i]] ++;
}
for(int i = 0;i < n;i ++){
d2[b[i]] ++;
}
bool flag = 1;
for(int i = 33;i <= 126;i ++){
if(d1[i] != d2[i]){//判断是否每个都相等
flag = 0;
break;
}
}
if(flag == 1){
cout << "YES\n";
} else {
cout << "NO\n";
}
}
return 0;
}
最终BOSS——T3:
这题一眼——分值500就知道不简单,我认为难度硬是要排的话甚至可以排到巅峰赛的第三题。
首先,我们需要深刻地剖析题意,看起来是放假,但是深加思考后会发现实际上就是要我们分面包,尽量切得不均匀,才能使这个最小值最大。那怎样切得尽量不均匀呢?就会有人想到等差数列了。而这一题的难点在于怎样得出等差数列的公差。——诶呀,两层for不就行了吗?(兄弟,你看看数据范围)。那我们要怎样得到公差呢——套公式!!众所周知,等差数列之和=末项 * n / 2。我们这里的n已经固定是3了,所以
x * 2 / 3
就可以得出最大的末项,而通过末项我们就可以用
(末项 - 1)/ 间隔数(2)
来得出公差,有了公差,再推下去,最后用min求答案即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
int gc = (int((n - 3) * 2 / 3) - 1) / 2,b = 1 + gc,c = (n - 3) - b - 1;//得出第一项、第二项、第三项
cout << min(min(abs(1 - b),abs(b - c)),abs(c - 1));//得出答案
return 0;
}
别看它代码这么少,你做出来了吗?!
如果这篇题解对你有用,还请点赞支持一下~
这里空空如也
有帮助,赞一个