题意:
现在有一些数,你要选择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;
}