A | 【2005普及】 陶陶摘苹果 |
直接全部遍历,记录符合答案的个数。
B | 【2005普及】校门外的树 |
第一遍用标记数组打标,然后再遍历。
C | 【2005普及】采药 |
01背包模板题
D | 【2005普及】循环 |
我不会qaq。。。。
E | 【2006普及】明明的随机数 |
遍历第一遍去重,第二遍排序。
F | 【2006普及】开心的金明 |
01背包稍微改动一下,状态转移方程改为
f[j]=max(f[j-v[i]]+v[i]*w[i],f[j]);
我是用深搜做的,只能勉强过,DP更好。
G | 【2006普及】Jam的计数法 |
看似复杂,不过多试验几次就好了。
要注意的几个点:
1.每次进位要把后边的字母全部改为比前面大一个的
2.每次循环更新当前可以接受的最大值(字母),就是我代码中的变量st
代码:
#include<bits/stdc++.h>
using namespace std;
int s,t,w,k,f;
char a[100100];
int main(){
scanf("%d%d%d",&s,&t,&w);
for(int i=1;i<=w;i++)cin>>a[i];
t+=97-1;
int y=w;
while(k<5){
int st=t-(w-y);
if((int)a[y]>=st){
y--;f=0;
}
else{
if(!f){
a[y]++;
for(int i=1;i+y<=w;i++)a[i+y]=a[i+y-1]+1;
f=1;
y=w;
k++;
for(int i=1;i<=w;i++)cout<<a[i];
cout<<endl;
}
else{
a[y]++;
k++;
for(int i=1;i<=w;i++)cout<<a[i];
cout<<endl;
}
}
}
return 0;
}
H | 【2006普及】数列 |
实际上数列的每一项都可以用二进制表示(3(k)表示3的k次方);
比如k=3时:
项数 二进制 数列中的项
n=1 0001 1=3(0)
n=2 0010 3=3(1)
n=3 0011 4=3(0)+3(1)
n=4 0100 9=3(2)
......
可以发现n转换为二进制后倒过来就是每一项的幂
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,k,sum,top;
int a[100100];
int main(){
scanf("%d%d",&n,&k);
while(k){
a[top++]=k%2;
k/=2;
}
for(int i=0;i<top;i++)sum+=a[i]*pow(n,i);
printf("%d",sum);
return 0;
}