您的位置:首页 > 文旅 > 旅游 > CSP-J模拟赛day1——解析+答案

CSP-J模拟赛day1——解析+答案

2024/10/5 9:13:58 来源:https://blog.csdn.net/CylMK/article/details/140646677  浏览:    关键词:CSP-J模拟赛day1——解析+答案

题目传送门


yjq的吉祥数

题解

送分题,暴力枚举即可

Code

#include<bits/stdc++.h>
using namespace std;int l,r;
int num=1,tmp=0,q[10000],a[10000];
int k (int x){for (int j=1;j<=tmp;j++){if (x==q[j])return 0;}return 1;
}
int main(){while (num<=10000000){tmp++;q[tmp]=num;num*=3;}cin>>l>>r;int cnt=0;for (int i=l;i<=r;i++){if (k(i)==0){cnt++;a[cnt]=i;}}cout<<cnt<<endl;for (int i=1;i<=cnt;i++){cout<<a[i]<<" ";}return 0;
}

yjq的二进制加法

题解

由题可得,每次只加一个 2 k 2^k 2k,也就是在二进制的情况下只有一个1,所以我们直接模拟就行了

Code

#include<bits/stdc++.h>
using namespace std;inline int read(){int x=0;char ch=' ';while (ch<'0'||ch>'9')ch=getchar();while (ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();return x; 
}
int a[4001000],n,m,ed;
int main(){string s;n=read();ed=n;cin>>s;int len=s.length();for (int i=len-1,j=0;i>=0,j<len;i--,j++){a[j]=s[i]-'0';}m=read();for (int i=1;i<=m;i++){int tmp;tmp=read();int cnt=0;for (int j=tmp;;j++){ed=max(ed,j);if (a[j]==1){cnt++;a[j]=0;}else {cnt++;a[j]=1;break;}}printf("%d\n",cnt);}      for (int i=ed;i>=0;i--){printf("%d",a[i]);}     return 0;
}

yjq的同桌分配

题解

很容易想到贪心的思路,但是无论是快排还是插排都需要 O ( n 2 ) O(n^2) O(n2)的时间复杂度,显然过不了,所以我们这里采用桶排,这样的时间复杂度就是 O ( 100 × n ) O(100 \times n) O(100×n)

Code

#include<bits/stdc++.h>
using namespace std;int n,b[1100],g[1100],tmpb[1100],tmpg[1100]; 
int q(){for (int i=1;i<=100;i++){tmpb[i]=b[i],tmpg[i]=g[i];}int l=1,r=100,maxn=INT_MIN,tmp;while (tmpb[l]==0)l++;while (tmpg[r]==0)r--;while (l<=100&&r>=1){tmp=min(tmpb[l],tmpg[r]);tmpb[l]-=tmp,tmpg[r]-=tmp;maxn=max(maxn,l+r);while (tmpb[l]==0&&l<=100)l++;while (tmpg[r]==0&&r>=1)r--;}return maxn;
}
int main(){cin>>n;for (int i=1;i<=n;i++){int tmp1,tmp2;cin>>tmp1>>tmp2;b[tmp1]++,g[tmp2]++;int ans=q();cout<<ans<<endl;}return 0;
}

yjq的炉石传说

题解

因为有过牌这一方法,所以这道题就直接变成了01背包问题

Code

#include<bits/stdc++.h>
using namespace std;long long x[10100],y[10100],dp[10100];
int main(){int n;cin>>n;for (int i=1;i<=n;i++){cin>>x[i];}for (int i=1;i<=n;i++){cin>>y[i];}for (int i=1;i<=n;i++){for (int j=n;j>=x[i];j--){dp[j]=max(dp[j],dp[j-x[i]]+y[i]);}}cout<<dp[n];return 0;
}

在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com