题解 P6014 【[CSGRound3]斗牛】

· · 题解

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

正文开始

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

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

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

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

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

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

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

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

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

那我们只要:

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

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

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

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

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

另外吐槽这题有黄题难度吗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;//完 结 撒 花
}