题目传送门
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;
}