解题思路:

注意事项:

参考代码:

#include<iostream>


#include<cstdio>


#include<algorithm>


#include<cmath>


#include<cstring>


#include<vector>


#include<utility>


#include<map>


#include<sstream>


using namespace std;


long long cnt[100005];


int main(){


long long n,K;


long long res=0;


cin>>n>>K;


for(int i=0;i<n;i++){


scanf("%d",&cnt[i]);


}


sort(cnt,cnt+n);//对数组进行排序


int len=(int)log10(K);//K的位数减一


int i;

//先从前往后拼接,前面的放在低位

for(i=0;i<n&&(int)log10(cnt[i])<len;i++){

//在K中取低位

int a=K%(int)pow(10,(int)(log10(cnt[i]))+1);

//在K中取高位

int b=K/(int)pow(10,(int)(log10(cnt[i]))+1);

//如果低位大于等于待拼接的数,则要寻的高位可以找等于k的高位的数

if(a>=cnt[i]){


int vis=upper_bound(cnt+i+1,cnt+n,b)-cnt-1;//在该范围内找第一个大于b的数,将地址减去一即是

//最后一个大于等于b的数



res+=vis-i;




}else{


int vis=lower_bound(cnt+i+1,cnt+n,b)-cnt-1;


res+=vis-i;


    


}


}


int tmp=i-1;


for(int j=tmp;j>0;j--){


int a=K%(long long)pow(10,(int)(log10(cnt[j]))+1);


int b=K/(long long)pow(10,(int)(log10(cnt[j]))+1);


if(a>=cnt[j]){


int vis=upper_bound(cnt,cnt+j,b)-cnt-1;


res+=vis+1;




}else{


int vis=lower_bound(cnt,cnt+j,b)-cnt-1;


res+=vis+1;




}


}


cout<<res<<endl;


return 0;


}


点赞(0)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论