NC21297. 手机号码
描述
输入描述
第一行输入两个整数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)