数鸭子
问题描述
湖边有一群鸭子,每一只鸭子都不⼀样,或羽毛不同,或性格不同。TT在脑子里开了一个 map<鸭子,整数>tong,把鸭⼦变成了一些数字。现在他好奇,有多少只鸭子映射成的数的数位中不同的数字个数小于 k 。
|
输⼊第一行包含两个数 n, k,表示鸭子的个数和题目要求的 k。 接下来一行有 n 个数 ai,每个数表示鸭子被TT映射之后的值。 n ≤ 1e6,k ≤ 1e6,ai ≤ 1e15。
|
Output
输出一行,一个数,表示满足题目描述的鸭子的个数。 无行末空格
|
Sample
Input: 6 5 123456789 9876543210 233 666 1 114514
Output: 4
|
Limitation
Time limit 1000 ms Memory limit 262144 kb
|
解题思路
就是求一堆数串中有多少个数串的不同数字个数小于 k,比如12345,其值为5;11111,其值为 1。
然而题目数据 k 可以大于 10,一共就 0..9 九个数字,出个 k > 10 的意义在哪,k > 10 的话不是都不用求直接输出 n 吗……搞得我开始想多了,还好最后几分钟没改,真的是想多了。
把输入的数当成字符串处理,数据范围用 long long
。
源代码
#include <iostream> #include <string> using namespace std;
bool solve(string a, long long k) { bool reach[10] = { false }; int count = 0; for (unsigned long long i = 0; i != a.length(); i++) { if (!reach[a[i] - '0']) { reach[a[i] - '0'] = true; count++; } if (count >= k) return false; } return true; }
int main() { long long n, k; cin >> n >> k; long long count = 0; for (long long i = 0; i < n; i++) { string a; cin >> a; if (solve(a, k)) count++; } cout << count << endl;
return 0; }
|