HXB的[ACGO欢乐赛#43]题解
2025-03-17 19:03:08
发布于:广东
卡点发布!
这次欢乐赛真的很欢乐,一般来说学过点C++/Python都能做出来
第一题判断就ok,重点记得要记得用else if
赛时代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define si short int
using namespace std;
const int N=1e3+9;
ll m;
int main()
{
cin>>m;
if(m<=100) cout<<m;
else if(m<=200) cout<<m-10;
else if(m<=300) cout<<m-20;
else if(m<=500) cout<<m-50;
else cout<<"NULL";
}
第二题也是so easy,重点就是输入之后要交换下标所对应的元素
赛时代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define si short int
using namespace std;
const int N=1e4+9;
ll n,l,r,num[N];
int main()
{
cin>>n>>l>>r;
for(ll i=1;i<=n;i++)
{
cin>>num[i];
}
swap(num[l],num[r]);
for(ll i=1;i<=n;i++)
{
cout<<num[i]<<" ";
}
}
第三题要给(指针)加特判(你可以这样理解:与时,指针在左上角,与时,指针在右上角,与时,指针在左下角,与时,指针在右下角,此时可以理解为我们所熟知的),而且得开long long
赛时代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define si short int
using namespace std;
const int N=1e4+9;
ll n,cnt,tmp;
int main()
{
cin>>n;
for(ll i=1;i<=n;i++)
{
for(ll j=1;j<=n;j++)
{
cin>>tmp;
if(!((i==1 || i==n)&&(j==1 || j==n))) cnt+=tmp;
}
}
cout<<cnt;
}
第四题暴力算的区间里各项的各位数字和是不是就行
赛时代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define si short int
using namespace std;
const int N=1e4+9;
ll l,r,k,tmp,sum,ans;
int main()
{
cin>>l>>r>>k;
for(ll i=l;i<=r;i++)
{
tmp=i,sum=0;
while(tmp && sum<=k) sum+=tmp%10,tmp/=10;
if(k==sum) ans++;
}
cout<<ans;
}
第五题你可以像我一样,由于题目保证只有一个M,所以可以用M前面的K个数乘上M后面的P个数就ok,因为一个前面的K会组合后面所有的P形成“KMP”(这道题在装自己是kmp)
(如:字符串为KKMPP时,第一个K会和第1个P和第二个P分别组成“KMP”,第二个K会和第1个P和第二个P分别组成“KMP”,所以总方案数为:简化可为,其中第一个是K的数量,第二个个P的数量)
赛时代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#define ll long long
#define si short int
using namespace std;
const int N=1e4+9;
string str;
ll lastSum,backSum;
bool flag;
int main()
{
cin>>str;
for(ll i=0;i<str.size();i++)
{
if(str[i]=='M') flag=1;
else if(flag && str[i]=='P') backSum++;
else if(!flag && str[i]=='K') lastSum++;
}
cout<<lastSum*backSum;
}
第六题我怕时间超时所以在全部数输进去了后取最大数做埃筛,最后暴力找第一个小于的素数,如果没有,会输出(也可以用二分),但是要注意这里是小于不是小于等于,当时就踩了这个坑
赛时代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
#include<queue>
#define ll long long
#define si short int
using namespace std;
const int N=1e6+9;
ll t,n,nMax,tmp;
bool canSum[N];
queue<ll> q;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
q.push(n);
nMax=max(n,nMax);
}
canSum[0]=canSum[1]=1;
for(ll i=2;i<=sqrt(nMax);i++)
{
if(!canSum[i])
{
for(ll j=i*2;j<=nMax;j+=i)
{
canSum[j]=1;
}
}
}
while(!q.empty())
{
tmp=q.front();
q.pop();
while(canSum[--tmp]);
cout<<tmp<<"\n";
}
}
(讨周边ing...)
全部评论 2
T6同感,我也是看错成小于等于,我还以为我欧拉筛写错了看了好几遍愣是没找到问题
2025-03-16 来自 江苏
1顶
2025-03-16 来自 广东
0
有帮助,赞一个