Week--16 CSP模拟 A TT数鸭子

题目原文

题目描述

这一天,TT因为疫情在家憋得难受,在云吸猫一小时后,TT决定去附近自家的山头游玩。
TT来到一个小湖边,看到了许多在湖边嬉戏的鸭子,TT顿生羡慕。此时他发现每一只鸭子都不一样,或羽毛不同,或性格不同。TT在脑子里开了一个map<鸭子,整数> tong,把鸭子变成了一些数字。现在他好奇,有多少只鸭子映射成的数的数位中不同的数字个数小于k。

输入描述

输入第一行包含两个数n,k,表示鸭子的个数和题目要求的k。
接下来一行有n个数,a_i,每个数表示鸭子被TT映射之后的值。

输出描述

输出一行,一个数,表示满足题目描述的鸭子的个数。
无行末空格

样例输入
6 5
123456789 9876543210 233 666 1 114514
样例输出
4
数据组成
数据点 n k a_i
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;
} 

小结

慎用特判,特判太多容易出错且不易修改。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容