30分求助
查看原帖
30分求助
724694
btxrrvt楼主2024/11/10 23:15

实在找不到哪里的策略还有问题

#include<bits/stdc++.h>
using namespace std;
int t,n,cnt=0;
map<int,vector<int>> mp;
vector<int> v;
vector<vector<int>> vv;
void fun(){
    mp.insert({7,{8}});
    mp.insert({6,{0,6,9}});
    mp.insert({5,{2,3,5}});
    mp.insert({4,{4}});
    mp.insert({3,{7}});
    mp.insert({2,{1}});
    mp.insert({1,{-1}});
}
void dfs(int sx,int b){
    if(b<=0){
        if(b==0){
            vector<int> t=v;
            if(v[0]==0){
                do{
                    vv.push_back(t);
                }while(next_permutation(t.begin(),t.end()));
                return;
            }
            vv.push_back(t);
            cnt++;
        }
        return;
    }
    for(int i=sx;i>=2;i--){
        for(auto j:mp[i]){
            v.insert(v.begin(),j);
            dfs(i-1,b-i);
            v.erase(v.begin());
        }
    }
}
void func(){
    if(n%7==0){
        for(int i=1;i<=n/7;i++) printf("%d",8);
        return;
    }else{
        v.clear();
        vv.clear();
        cnt=0;
        if(n/7==0||n==7){
            if(n==6) printf("%d\n",6);
            else printf("%d\n",mp[n][0]);
            return;
        }
        int a=n/7;
        int b=n%7+7;
        for(int i=1;i<=a-1;i++) v.insert(v.begin(),8);
        // 14根木棍以内的分配
        dfs(7,b);
        
        if(cnt==0){
            printf("%d\n",-1);
            return;
        }
        sort(vv.begin(),vv.end(),[](vector<int> v1,vector<int> v2){
            if(v1.size()==v2.size()){
                for(int i=0;i<v1.size();i++){
                    if(v1[i]!=v2[i]){
                        return v1[i]<v2[i];
                    }
                }
                return true;
            }else{
                return v1.size()<v2.size();
            }
        });
        for(int i=0;i<vv.size();i++){
            if(vv[i][0]!=0){
                for(auto j:vv[i]){
                    printf("%d",j);
                }
                printf("\n");
                return;
            }
        }
        return;
    }
}

int main(){
    freopen("1.in","r",stdin);
    freopen("1.out","w",stdout);
    fun();
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        func();
    }
    return 0;
}

2024/11/10 23:15
加载中...