“科大讯飞杯”第18届上海大学 H 纸牌游戏 —— 爆搜

82 篇文章 1 订阅

This way

题意:

现在有一些数,你要选择k个数使得他们所组成的数%3=0并且这个数最大,问你这个数是什么

题解:

一般字典序的题目都是贪心的考虑每一位的来着。。但是这道题我也不知道为什么不行,可能是我检查的还不够到位吧,赛后看了别人的代码发现爆搜就可以,,因为每个值都只有3种情况,所以只有 3 10 3^{10} 310种情况。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int num[10],ans[10];
char s[N];
int dfs(int now,int k,int ret){
    if(!now){
        if(ret||k>num[0])return 0;
        ans[0]=k;
        if(k==1)
            return 1;
        for(int i=1;i<=9;i++)
            if(ans[i])
                return 1;
        ans[0]=0;
        return 0;
    }
    if(!k&&!ret)return 1;
    if(now<0)return 0;
    int r=min(num[now],k),l=max(0,r-2);
    for(int i=r;i>=l;i--){
        ans[now]=i;
        if(dfs(now-1,k-i,(ret+i*now)%3)){
            return 1;
        }
        ans[now]=0;
    }
    return 0;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        memset(num,0,sizeof(num));
        memset(ans,0,sizeof(ans));
        int k;
        scanf("%s%d",s+1,&k);
        int n=strlen(s+1);
        for(int i=1;i<=n;i++)
            num[s[i]-'0']++;
        if(!dfs(9,k,0))
            printf("-1\n");
        else{
            for(int i=9;~i;i--)
                for(int j=1;j<=ans[i];j++)
                    printf("%d",i);
            printf("\n");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值