枚举与尺取
题目:第几个幸运数字
#include<bits/stdc++.h>
using namespace std;
int main(){
int i,j,k;
long long n=59084709587505;
int cnt=0;
for(i=0;pow(7,i)<n;i++)
for(j=0;pow(5,j)<n;j++)
for(k=0;pow(3,k)<n;k++)
if(pow(7,i)*pow(5,j)*pow(3,k)<=n)
cnt++;
cout<<cnt-1;//幸运数字不包括1
return 0;
}
题目:特别数的和
#include<bits/stdc++.h>
using namespace std;
int main(){
long long sum=0;
int t,n;
cin>>n;
for(int i=1;i<=n;i++){
t=i;
while(t){
if(t%10==2|t%10==0|t%10==1|t%10==9){
sum=sum+i; //累加
break;
}
t=t/10;
}
}
cout<<sum;
return 0;
}
题目:单词分析
#include <bits/stdc++.h>
using namespace std;
int c[26];
int main()
{
string a;
cin>>a;
int max=0;
int b=97;
char x;
for(int i=0;i<a.length();i++)
{
c[a[i]-'a']++;//把每个字母的个数记录 'a'=97
}
for(int i=0;i<26;i++)
{
if(c[i]>max){
max=c[i];//选出出现个数最多的字母
x=i+'a';//ASCII码转回字符
}
}
cout<<x<<endl<<max<<endl;
return 0;
}
题目:排列型枚举(全排列)Ann
#include<bits/stdc++.h>
using namespace std;
int n;//共计个数
int order[20];
bool chosen[20];
int sum=0;
void calc(int k){
if(k==n+1){
for(int i=1;i<=n;i++){
cout<<order[i]<<" ";//排列组
}
sum++;//排列个数
puts("");
return;
}
for(int i=1;i<=n;i++){
if(chosen[i])
continue;
order[k]=i;
chosen[i]=i;
calc(k+1);
chosen[i]=0;
order[k]=0;
}
}
int main(){
cin>>n;
calc(1);
cout<<sum;
return 0;
}
题目:组合型枚举 Cnm
#include<bits/stdc++.h>
using namespace std;
int n;//共计个数
int m;//选m个数
vector<int> chosen;
string s[1050];
int sum=0;
void calc(int x){
if(chosen.size()>m||chosen.size()+(n-x+1)<m)//剪枝
return;
if(x==n+1){//选够m个数输出
for(int i=0;i<chosen.size();i++)
cout<<s[chosen[i]]<<" ";
puts("");
sum++;
return;
}
chosen.push_back(x);
calc(x+1);
chosen.pop_back();//消除痕迹
calc(x+1);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>s[i];//输入被选择的字符,如 1 2 3 4 5
}
calc(1);
cout<<sum;
return 0;
}