欢乐赛#33题解
2024-11-11 19:39:52
发布于:北京
以前欢乐赛好多次都不AK,终于全对了,发个题解。
第一题:换行
这是一道签到的题目
话不多说,直接上代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
cout << "\\n";
return 0;
}
第二题:求和
n <= 2147483647
循环遍历肯定超时,只能用求和公式。
如果n为奇数,公式为:(n+1)(n/2)+(n/2+1)
如果n为偶数,公式为:(n+1)(n/2)
上代码
#include <bits/stdc++.h>
using namespace std;
void f(){
long long a; // 注意数据类型
cin >> a;
if(a%2 == 1) cout << (a+1)*(a/2)+(a/2+1) << endl;
else cout << (a+1)*(a/2) << endl;
}
int main()
{
int t;
cin >> t;
while(t--)f();
return 0;
}
第三题:权重
这题相对简单,按照题目模拟即可
注意开 long long
代码奉上
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
long long a,b,c,d,e;
cin >> a >> b >> c >> d >> e;
long long a1 = 0,e1 = 0,i1 = 0,o1 = 0,u1 = 0;
for(int i = 0;i < s.size();i++){
if(s[i] == 'a') a1++;
else if(s[i] == 'e') e1++;
else if(s[i] == 'i') i1++;
else if(s[i] == 'o') o1++;
else if(s[i] == 'u') u1++;
}
cout << a*a1+b*e1+c*i1+d*o1+e*u1;
return 0;
}
第四题:因子
这题本来不是很难,但是卡了我7次
可以先用自定义函数求出每个数的因子,再排序,统计前缀和,再用二分。(我的方法十分复杂,可以直接求出因子,在循环遍历)
代码
#include <bits/stdc++.h>
using namespace std;
int a[100005],s[100005];
int f(int a){
int cnt = 0;
for(int i = 1;i*i <= a;i++){
if(a%i == 0 && i*i == a) cnt++;
else if(a%i == 0) cnt += 2;
}
return cnt;
}
bool cmp(int a,int b){return a>b;}
int main()
{
int n,m;
cin >> n >> m;
for(int i = 1;i <= n;i++){
cin >> a[i];
a[i] = f(a[i]);
}
sort(a+1,a+n+1,cmp); // 排序
for(int i = 1;i <= n;i++)
s[i] = s[i-1]+a[i]; // 前缀和
cout << lower_bound(s****+n+1,m)-s; // 返回的是第一个大于等于m的数组下标的地址,所以要减去s数组的下标
return 0;
}
第五题:美丽数组
题目中已经告诉我们回文数组的判断方法,我们只需要把奇数下标的和统计出来,把偶数下标的和统计出来,再比较即可
代码奉上
#include <bits/stdc++.h>
using namespace std;
int a[100005];
void f(){
int n;
cin >> n;
memset(a,0,sizeof a);
long long flag = 0,cnt1 = 0,cnt2 = 0;
for(int i = 1;i <= n;i++) cin >> a[i];
for(int i = 1;i <= n;i++){
if(a[i] != a[n-i+1]) flag = 1;
if(i%2 == 0) cnt1 += a[i];
else cnt2 += a[i];
}
if(cnt1 == cnt2 && flag == 1) cout << "Yes" << endl;
else cout << "No" << endl;
}
int main()
{
int t;
cin >> t;
while(t--)f();
return 0;
}
第六题:字典序问题
这题考的是字典序,与整数的最大不同是字典序是逐位比较
比如99>100,因为99的第一位9大于100的第一位1
按照这个思路,我们只需要判断一下字符串n的每一位是不是9,如果都是,就输出n,如果不是,就输出n-1个9
string a;
cin >> a;
int flag = 0;
for(int i = 0;i < a.size();i++){
if(a[i] != '9'){
flag = 1;
break;
}
}
if(flag == 0) cout << a;
else{
for(int i = 0;i < a.size()-1;i++)
cout << 9;
}
可是这样的代码只能过部分分
比如输入一个9998
按照上述代码只会输出999,可是9998的字典序是大于999的,所以还要加一个判断
可以循环遍历到n.size()-1,每一次都输出一个9,再判断是不是都是9
如果不是,就结束
如果是,就把n的最后一个字符输出
最终代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string a;
cin >> a;
int flag = 0;
for(int i = 0;i < a.size()-1;i++){
cout << 9;
if(a[i] != '9')
flag = 1;
}
if(flag == 0)
cout << a[a.size()-1];
return 0;
}
各位如果觉得不错,能否给个赞?
全部评论 2
顶
2024-11-13 来自 广东
02024-11-13 来自 天津
0
有帮助,赞一个