自学内容网 自学内容网

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;
}

在这里插入图片描述
在这里插入图片描述


原文地址:https://blog.csdn.net/CylMK/article/details/140646677

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!