(2017/4、8、/ B - Divide by Three) CodeForces - 792C (dp)(暴力破解)

35 篇文章 0 订阅

这个题目的要求是减少最小数目的字符,使原字符变成一个能够被三整除的数目;

这题目我一直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;
}

 处理零?

进行改进

~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值