列表

详情


NC21297. 手机号码

描述

给你一个整数n表示手机号码的位数
再给你m个字符串表示保留的号码,比如911 110 120等
问你一共有多少的手机号码不以保留号码开头

输入描述

第一行输入两个整数n, m (1 ≤ n ≤ 17, 0 ≤ m ≤ 50)
接下来m行每行输入一个数字串,长度为1到n

输出描述

输出一个整数

示例1

输入:

7 3
0 
1
911

输出:

7990000

示例2

输入:

10 3
0
1
911

输出:

7990000000

示例3

输入:

8 3
1
12
123

输出:

90000000

示例4

输入:

9 3
12
13
14

输出:

970000000

示例5

输入:

3 1
411

输出:

999

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3(pypy3.6.1) 解法, 执行用时: 53ms, 内存消耗: 18800K, 提交时间: 2020-12-16 22:21:01

args=[]
exception=0
(n,m)=map(int,input().split())
for i in range(0,m):
    args.append(input())
args=sorted(args,key=lambda x:(int(x)*(10**(n-len(x))),len(x)))
sum=10**n
basic=0
for i in args:
        temp=int(i)*(10**(n-len(i)))
        if(basic<10**n and basic <=temp):
            exception+=10**(n-len(i))
            basic=(int(i)+1)*(10**(n-len(i)))
        elif(basic==10**n):break
        else:continue
print(sum-exception)

C++ 解法, 执行用时: 9ms, 内存消耗: 400K, 提交时间: 2021-05-31 07:52:51

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll sum;
ll n,m;
int main()
{
	ll b[10000];
	cin>>n>>m;
	sum=pow(10,n);
	string str[m];
	for(ll i=0;i<m;i++)
	{
		cin>>str[i];
		b[i]=1;
    }
    for(ll i=0;i<m;i++)
    {
        ll s=str[i].size();
		for(ll j=0;j<m;j++)
		{
			if(str[i].find(str[j])==0&&i!=j)
			b[i]=0;
		}
		if(b[i])
		sum-=(long long)pow(10,n-s);
	}
	cout<<sum;
	return 0;
}

Python3(3.9) 解法, 执行用时: 20ms, 内存消耗: 2936K, 提交时间: 2021-03-03 20:20:29

n,m=map(int,input().split())
s=[]
for _ in range(m):
    s.append(input())
sum=pow(10,n)
num=0
for i in range(m):
    flag=False
    for j in range(m):
        if s[i].startswith(s[j])and i!=j:
            flag=True
            break
        else:
            continue
    if flag ==False:
        num+=pow(10,n-len(s[i]))
print(sum-num)

上一题