欢乐赛#33题解
2024-11-11 18:40:24
发布于:江苏
第一题.A33695.换行
回到题目
这道题需要输出\n,那我们可以把\和n分开输出。
#include <iostream>
using namespace std;
int main()
{
cout << char(92) << 'n';//'\'的ASCII码值是92
return 0;
}
我们还可以直接输出\n
#include <cstdio>
using namespace std;
int main()
{
printf("\\n");
return 0;
}
第二题.A33696.求和
回到题目
这道题只需要用等差数列求和公式(1+n)*n/2,需要注意的是和有可能大于int变量的范围,所以要定义成long long类型。
#include <cstdio>
using namespace std;
long long t,n;
int main()
{
scanf("%lld",&t);
for (int i=1; i<=t; i++)
{
scanf("%lld",&n);
printf("%lld\n",(1+n)*n>>1);//也可以写成(1+n)*n/2
}
return 0;
}
第三题.A33697.权重
回到题目
这道题要在字符串中找到相应字符a,e,i,o,u的出现次数并乘以他们的权值,最后把这些结果相加并输出。这里每一个字符的权值的最大值是两倍的int类型的范围,所以变量要定义成long long类型的。
#include <iostream>
#include <cstdio>
using namespace std;
string str;
long long n[5],w,s;
int main()
{
cin >> str;
for (int i=0; i<str.size(); i++)
{
if (str[i]=='a') n[0]++;
else if (str[i]=='e') n[1]++;
else if (str[i]=='i') n[2]++;
else if (str[i]=='o') n[3]++;
else if (str[i]=='u') n[4]++;
}
for (int i=0; i<5; i++)
{
scanf("%d",&w);//记录每一个字符的权值
s+=w*n[i];
}
printf("%lld",s);
return 0;
}
第四题.A33698.因子
回到题目
这道题要把每一个数的因子个数统计出来并排序,先判断最多的一个数的因子个数是否大于等于m,不满足就从大到小把每个数的因子个数相加并判断是否大于等于m,成立就直接输出。
#include <iostream>
#include <algorithm>
using namespace std;
int s(int n)//统计每一个数的因子个数
{
int t=0;
for (int i=1; i*i<=n; i++)
{
if (n%i==0) t+=2;
if (i*i==n) t--;//会出现例如2*2的情况,要特判
}
return t;
}
long long n,m,x,a[(int)1e7],rt[(int)1e7],dp[(int)1e7];
int main()
{
cin >> n >> m;
for (int i=1; i<=n; i++)
{
cin >> a[i];
dp[i]=s(a[i]);
}
sort(dp+1,dp+n+1);
if (dp[n]>=m) x=1;//判断最多的一个数的因子个数是否大于等于m
else//否则找到最少的数的因子个数且大于等于m
{
int s=0;
for (int i=n; i>=1; i--)
{
s+=dp[i];
if (s>=m)
{
x=n-i+1;
break;
}
}
}
cout << x;
return 0;
}
第五题.A33699.美丽数组
回到题目
这道题只需要判断每一个数组是否满足美丽数组的条件,可以定义两个函数来实现。
#include <iostream>
using namespace std;
bool ck(int a[],int n)//判断下标为奇数对应的元素和和下标为偶数对应的元素和是否相等
{
long long s=0,s2=0;
for (int i=1; i<=n; i++)
{
if (i%2==0) s+=a[i];
else s2+=a[i];
}
if (s==s2) return 1;
return 0;
}
bool ck2(int a[],int n)//判断是否为回文数
{
int l=1,r=n;
while (l<r)
{
if (a[l]==a[r]) l++,r--;
else return 1;
}
return 0;
}
int t,n,a[(int)1e5+1];
int main()
{
cin >> t;
while (t--)
{
cin >> n;
for (int i=1; i<=n; i++) cin >> a[i];//下标要从1开始
if (ck(a,n) && ck2(a,n)) cout << "Yes" << '\n';
else cout << "No" << '\n';
}
return 0;
}
第六题.A33700.字典序问题
回答题目
这道题只要找到一个除最后一位外都是9且小于等于字符串n的字符串,再在字符串的末尾根据情况加上可以加上的最大数。
#include <iostream>
using namespace std;
string n,a;
int len;
int main()
{
cin >> n;
len=n.size();
while (len>1)//除最后一位外都是9
{
cout << 9;
a+="9";
len--;
}
if (n[n.size()-1]>'0' && a+"1"<=n) cout << n[n.size()-1];//判断能不能再加一位
//字符串比较大小 ,看再加一位是否小于等于字符串n
return 0;
}
全部评论 2
顶
3天前 来自 广东
0第一次发题解,见谅
3天前 来自 江苏
0
有帮助,赞一个