这个题目的要求是减少最小数目的字符,使原字符变成一个能够被三整除的数目;
这题目我一直wa 一组测试用例足以说明问题;
//20000111
//200001
我之前是直接枚举,1~9的各个数,先枚举去掉一个,之后再枚举去掉两个的,但是我没有考虑这种情况,第一个用例我的代码的输出结果是111 但是这样是错误的,这样就去掉了5个代码,而200001,去掉了两个;
错误代码
#include <iostream>
#include<queue>
#include<string>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=100005;
queue<int> num[15];
queue<int> ans[100];
string s;
int t;
void print()
{ int flag=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='.')
continue;
else
{ if(flag==0&&s[i]=='0')
continue;
flag=1;
printf("%c",s[i]);
}
}
if(flag==0)
printf("0");
}
void printt()
{
int flag=0;
for(int i=0;i<s.size();i++)
{
if(s[i]=='3'||s[i]=='0'||s[i]=='6'||s[i]=='9')
{ if(flag==0&&s[i]=='0')
continue;
flag=1;
printf("%c",s[i]);
}
}
}
int main()
{
cin>>s;
for(int i=0;i<=9;i++)
{
while(num[i].size())
num[i].pop();
}
for(int i=0;i<s.size();i++)
{
num[s[i]-'0'].push(i);
}
int x=0,y=0;
int xx=0;
int have=0;
for(int i=1;i<=9;i++)
{
if(i==3||i==6||i==9)
{ if(num[i].size())
have=1;
continue;
}
if(num[i].size())
{
x+=num[i].size()*i;
xx+=num[i].size();
}
}
y=x%3;
// if(s[0]=='0')
// cout<<"-1";
if(y==0)
cout<<s;
else
{ int flag=0;
for(int i=8;i>=1;i--)
{ y=x-i;
if(y%3==0&&num[i].size())
{
t=num[i].front();
s[t]='.';
flag=1;
break;
}
}
if(flag==1)
print();
else
{ if(xx>2)
{
for(int i=8;i>=1;i--)
{ y = x - i;
if(flag ==1)
break;
if(num[i].size())
{
t = num[i].front();
s[t] = '.';
num[i].pop();
for (int j = 8;j >= 1; j--)
{
y = y - j;
if(y % 3 == 0 && num[j].size())
{
int tt = num[j].front();
s[tt] = '.';
flag = 1;
break;
}
}
num[i].push(t);
s[t]='0'+i;
}
}
}
if(flag==0&&have)
{ flag=3;
printt();
}
if(flag==0)
{
if(num[0].size())
{
flag=2;
cout<<"0";
}
}
if(flag==1)
print();
}
if(flag==0)
cout<<"-1";
}
return 0;
}
处理零?
进行改进
~