题目原文
题目描述
这一天,TT因为疫情在家憋得难受,在云吸猫一小时后,TT决定去附近自家的山头游玩。
TT来到一个小湖边,看到了许多在湖边嬉戏的鸭子,TT顿生羡慕。此时他发现每一只鸭子都不一样,或羽毛不同,或性格不同。TT在脑子里开了一个map<鸭子,整数> tong,把鸭子变成了一些数字。现在他好奇,有多少只鸭子映射成的数的数位中不同的数字个数小于k。
输入描述
输入第一行包含两个数n,k,表示鸭子的个数和题目要求的k。
接下来一行有n个数,,每个数表示鸭子被TT映射之后的值。
输出描述
输出一行,一个数,表示满足题目描述的鸭子的个数。
无行末空格
样例输入
6 5
123456789 9876543210 233 666 1 114514
样例输出
4
数据组成
数据点 | n | k | |
---|---|---|---|
1 | 1000 | 10 | 106 |
2 | 1000 | 1 | 106 |
3,4,5 | 105 | 100 | 109 |
6,7,8,9,10 | 106 | 106 | 1015 |
解题思路
读入数据后对每个数据进行不同数字个数计算,进行相应特判,与K进行比较,筛选出符合条件的个数。
实现代码
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<cmath>
using namespace std;
//map<long long int,int>du;
bool vis[10];
int k,count=0;
int search(long long s){
/* long long t=pow(10,k+1);
t-=1;
if(s<=t)
{
// count++;
return -1;
}/
else
{*/
int ans=0;
memset(vis,0,sizeof(vis));
if(s==0)
return 1;
else{
long long p=s;
while(p){
vis[p%10]=1;
p/=10;
}
for(int i=0;i<10;i++){
if(vis[i]==1){
ans++;
}
}
return ans;
}
// }
}
int main(){
int n;
cin>>n>>k;
if(k>10){
count=n;
cout<<count<<endl;
exit(0);
}
else if(k<1){
count=0;
cout<<count<<endl;
exit(0);
}
count=0;
long long t;
int du=0;
for(int i=1;i<=n;i++){
scanf("%lld",&t);
du=search(t);
//cout<<du[t]<<endl;
if(du<k){
count++;
}
//cout<<count<<endl;
}
cout<<count<<endl;
return 0;
}
小结
慎用特判,特判太多容易出错且不易修改。