1 条题解

  • 1
    @ 2025-1-31 18:38:58

    题前:

    悲!就因在考场上写错一个数字,AC变70!

    这道题我在盐城大丰高级中学的考场上用了1小时+(因为就剩1小时+的时间了),所以我本来只想骗骗分,可没想到越做越顺手,到最后竟用打表暴力O(1)时间复杂度做完了??!!!

    其实此题也没什么难的,就是推推规律就知道怎么做了。

    思路:

    我们可以用几位数来解决这道题。

    注意:此题只有木棍数为1的时候无解输出-1,其它木棍数是绝对有解绝不输出-1的。所以想用-1来骗分的你会爆0或只能拿10分。

    由题可知,一位数内,用木棍数最少的数字是1,用了2根;用木棍数最多的数字是8,用了7根。当木棍数超过7根时,我们便来到了二位数二位数内,用木棍数最少的数字是10,用了8根;用木棍数最多的数字是88,用了15根。当木棍数超过15根时,我们便来到了三位数。以此类推,木棍数每7根为一个位数,接下来我们就逐一分析。

    一位数:这个就是自己在题目给的图片数一下木棍数就出来了,没什么好讲的。(但是就是因为在这里写错一个数字,AC变70!)

    二位数:逐一分析。木棍数8,数字10。木棍数9,数字18。木棍数10,数字22。木棍数11,数字20。木棍数12,数字28。木棍数13,数字68。木棍数14,数字88。

    三位数:逐一分析。木棍数15,数字108。木棍数16,数字188。木棍数17,数字200。木棍数18,数字208。木棍数19,数字288。木棍数20,数字688。木棍数21,数字888。

    四位数:逐一分析。木棍数22,数字1088。木棍数23,数字1888。木棍数24,数字2008。木棍数25,数字2088。木棍数26,数字2888。木棍数27,数字6888。木棍数28,数字8888。

    结合二三四位数,同余的数都是有规律的。

    余数为1:二位数输出10,三位数及以上就在10后加位数-2个8。 余数为2:二位数及以上就在1后加位数-1个8。 余数为3:二位数输出22,三位数输出200,四位数及以上就在200后加位数-3个8。 余数为4:二位数输出20,三位数及以上就在20后加位数-2个8。 余数为5:二位数及以上就在2后加位数-1个8。 余数为6:二位数及以上就在6后加位数-1个8。 余数为0:几位数就几个8。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        freopen("sticks.in","r",stdin);
      	freopen("sticks.out","w",stdout);
        int t,n;
        cin>>t;
        while(t--){
            cin>>n;
            if(n==1){
                cout<<-1;
                cout<<endl;
            }
            else if(n==2){
                cout<<1;
                cout<<endl;
            }
            else if(n==3){
                cout<<7;
                cout<<endl;
            }
            else if(n==4){
                cout<<4;
                cout<<endl;
            }
            else if(n==5){
                cout<<2;//本来输出2我写的输出5,AC变70,悲!
                cout<<endl;
            }
            else if(n==6){
                cout<<6;
                cout<<endl;
            }
            else if(n%7==0&&n>=7){
                for(int i=1;i<=n/7;i++){
                    cout<<8;
                }
                cout<<endl;
            }
            else if(n%7==1&&n>=8){
                if(n==8){
                    cout<<10;
                }
                else{
                    cout<<10;
                    for(int i=1;i<=n/7-1;i++){
                        cout<<8;
                    }
                }
                cout<<endl;
            }
            else if(n%7==2&&n>=9){
                cout<<1;
                for(int i=1;i<=n/7;i++){
                    cout<<8;
                }
                cout<<endl;
            }
            else if(n%7==3&&n>=10){
                if(n==10){
                    cout<<22;
                }
                else{
                    cout<<200;
                    for(int i=1;i<=n/7-2;i++){
                        cout<<8;
                    }
                }
                cout<<endl;
            }
            else if(n%7==4&&n>=11){
                if(n==11){
                    cout<<20;
                }
                else{
                    cout<<20;
                    for(int i=1;i<=n/7-1;i++){
                        cout<<8;
                    }
                }
                cout<<endl;
            }
            else if(n%7==5&&n>=12){
                cout<<2;
                for(int i=1;i<=n/7;i++){
                    cout<<8;
                }
                cout<<endl;
            }
            else if(n%7==6&&n>=13){
                cout<<6;
                for(int i=1;i<=n/7;i++){
                    cout<<8;
                }
                cout<<endl;
            }
        }
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
    

    信息

    ID
    34939
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    5
    已通过
    3
    上传者