题解:B4058 [语言月赛 202411] 三角含数

· · 题解

考察数位的提取、子函数的定义、数组、循环结构,对后三者的考察较为灵活。

首先枚举 x\in[l,r],然后判断 x 是否合法。

然后先提取 x 的六个数位,只需不断 x/=10,取 x\% 10 就可以,先用一个大小为 6 的数组 a_{1}\dots a_{6} 存下它们。

由于只用分成两组数,只需要枚举 1<i<j 使得 a_1,a_i,a_j 分成一组即可,剩下三个数正好分成另一组。

接下来是判断三个数能否组成三角形,根据小学知识,设三个数从小到大分别为 A,B,C,则只需 A+B>C 即可。

然后就 OK 了,可以发现我们没必要特判某个数位为 0,因为只要有 0 在就不可能组成三角形,核心代码如下:

bool check(int a,int b,int c){
    int A=min({a,b,c}),C=max({a,b,c}),B=a+b+c-A-C;
    return A+B>C;
}
int a[7],b[4];
bool Check(int x){
    for(int i=1;i<=6;i++)a[i]=x%10,x/=10;
    for(int i=2;i<=6;i++)for(int j=i+1;j<=6;j++)if(check(a[1],a[i],a[j])){
        int n=0;
        for(int k=2;k<=6;k++)if(k!=i&&k!=j)b[++n]=a[k];
        if(check(b[1],b[2],b[3]))return 1;
    }
    return 0;
}
int main(){
    int l,r,ans=0;
    cin>>l>>r;
    for(int i=l;i<=r;i++)if(Check(i))ans++;
    cout<<ans;
    return 0;
}