1 条题解

  • 0
    @ 2025-8-24 21:16:49

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 未来姚班zyl
    欢迎加入粉丝团!https://www.luogu.com.cn/team/72518|AFO

    搬运于2025-08-24 21:16:48,当前版本为作者最后更新于2024-11-18 15:20:27,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


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

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

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

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

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

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

    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;
    }
    
    • 1

    信息

    ID
    10842
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者