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