1 条题解

  • 0
    @ 2025-8-24 22:16:32

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar wpy233
    你弱归你弱,py比你弱。 stO 所有关注我的巨佬 Orz

    搬运于2025-08-24 22:16:32,当前版本为作者最后更新于2020-01-29 11:07:53,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    怎么感觉楼上楼下的dalaodalao们这题都做烦了呀……


    正文开始

    众所周知,这道题目直接枚举n2n-2个数然后再累加计算肯定是不行的(会TT虽然我没试过haha),貌似会得到50pts50pts的好成绩。

    但是,如果让我们来枚举剩下的两个数就非常容易了(效率就能高一大截,并拿到80pts80pts的好成绩)……

    萌新:诶,打住打住,那怎么判断剩下数的和是不是1010的倍数呢?!!

    作者:你先在输入的时候把和累加一下,然后再减去枚举的两个数不就行了嘛~

    其实(呵呵),这题剩下的两个数根本就不用枚举!!!吓死我了

    我们把所有和都累加起来,得到一个值(比如说是1926081719260817),那我如果要让这个数是1010的倍数,我只要把这个末位的77给减掉不就行了 被吓死*2

    萌新是的我又来了:诶,那把这个1717给减掉不也行耶???

    是的,这回楼上回的没错。因为给定的数是11~1010范围内的,所以自然也可以凑出两个数,让它们的和为1717

    这么一来,我们不就做完了吗???被吓死*3

    那我们只要:

    ①开一个数组,累计00~99出现的次数(为毛不是11~1010?你想想呀在这个题目中101000有什么区别?10就是来打酱油的

    ②计算所有数之和并%10\%10

    ③判断能否用两个数字组成所有数之和%10\%10或所有数之和%10+10\%10+10即可。

    例如:19260817%10=719260817\%10=7,我们只要判断有没有两个数字可以组成771717就行了。

    最优一发58ms58ms,貌似挺优了吧……

    另外吐槽这题有黄题难度吗qaq

    正解应该不算难想吧

    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int a[15];//定义累计数字数组
    long long ans=0;//其实这里用int就够了,不过保险起见&内存充足时用long long还是万无一失吧
    int main()
    {
    	cin>>n;
    	int x;
    	for(int i=1;i<=n;i++)
    	{
    		scanf("%d",&x);//输入每个数字
    		if(x==10) a[0]++;//10跟0没区别呀~
    		else a[x]++;
    		ans+=x%10;//累加
    	}
    	int t=ans%10;
        //以下是略长的判断过程
    	if(t==0) if(a[0]>=2||a[1]&&a[9]||a[2]&&a[8]||a[3]&&a[7]||a[4]&&a[6]||a[5]>=2) cout<<10<<endl; else cout<<0<<endl;
    	if(t==1) if(a[0]&&a[1]||a[2]&&a[9]||a[3]&&a[8]||a[4]&&a[7]||a[5]&&a[6]) cout<<1<<endl; else cout<<0<<endl;
    	if(t==2) if(a[0]&&a[2]||a[1]>=2||a[3]&&a[9]||a[4]&&a[8]||a[5]&&a[7]||a[6]>=2) cout<<2<<endl; else cout<<0<<endl;
    	if(t==3) if(a[0]&&a[3]||a[1]&&a[2]||a[4]&&a[9]||a[5]&&a[8]||a[6]&&a[7]) cout<<3<<endl; else cout<<0<<endl;
    	if(t==4) if(a[0]&&a[4]||a[1]&&a[3]||a[2]>=2||a[5]&&a[9]||a[6]&&a[8]||a[7]>=2) cout<<4<<endl; else cout<<0<<endl;
    	if(t==5) if(a[0]&&a[5]||a[1]&&a[4]||a[2]&&a[3]||a[6]&&a[9]||a[7]&&a[8]) cout<<5<<endl; else cout<<0<<endl;
    	if(t==6) if(a[0]&&a[6]||a[1]&&a[5]||a[2]&&a[4]||a[3]>=2||a[7]&&a[9]||a[8]>=2) cout<<6<<endl; else cout<<0<<endl;
    	if(t==7) if(a[0]&&a[7]||a[1]&&a[6]||a[2]&&a[5]||a[3]&&a[4]||a[8]&&a[9]) cout<<7<<endl; else cout<<0<<endl;
    	if(t==8) if(a[0]&&a[8]||a[1]&&a[7]||a[2]&&a[6]||a[3]&&a[5]||a[4]>=2||a[9]>=2) cout<<8<<endl; else cout<<0<<endl;
    	if(t==9) if(a[0]&&a[9]||a[1]&&a[8]||a[2]&&a[7]||a[3]&&a[6]||a[4]&&a[5]) cout<<9<<endl; else cout<<0<<endl;
        //如上,依次判断能不能有两个数字组成ans%10或ans%10+10即可
    	return 0;//完 结 撒 花
    }
    
    • 1

    信息

    ID
    4760
    时间
    1000ms
    内存
    125MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者