CodeForces - 792C

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces - 792C相关的知识,希望对你有一定的参考价值。

vj训练时的题,改了两个小时bug。只要把情况都考虑全考虑清楚这个题就比较好写了。

要注意搜索时从后向前搜索比较容易处理10111这种情况。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 using namespace std;
  5 
  6 char s[100010],s1[100010],s2[100010],s3[100010],s11[100010];
  7 
  8 int main()
  9 {
 10     scanf("%s",&s);
 11     int len;
 12     len=strlen(s);
 13     int sum=0,a=0;
 14     for(int i=0; i<len; i++)
 15     {
 16         sum+=s[i]-0;
 17         if(s[i]==0)//为了输出时分辨11和101的情况
 18             a=1;
 19     }
 20     if(sum%3==0)//直接输出去掉前导零的串
 21     {
 22         int cnt=0;
 23         for(int i=0; i<len-1; i++)
 24         {
 25             if(s[i]!=0)
 26                 break;
 27             else
 28                 cnt++;
 29         }
 30         int j=0;
 31         for(int i=cnt; i<len; i++)
 32             s1[j++]=s[i];
 33         cout<<s1<<endl;
 34     }
 35     else
 36     {
 37         int num=sum%3;//这样存不用分余2和余1两种情况
 38         int cnt1=-1,cnt2=-1,cnt3=-1;
 39         int t1=0,t2=0;
 40         for(int i=len-1; i>=0; i--)//从后向前找与num相同的位数
 41         {
 42             if((s[i]-0)%3==num)
 43             {
 44                 cnt1=i;
 45                 break;
 46             }
 47         }
 48         if(cnt1!=-1)
 49         {
 50             int j=0;
 51             for(int i=0; i<len; i++)
 52             {
 53                 if(i==cnt1)
 54                     continue;
 55                 else
 56                     s1[j++]=s[i];
 57             }
 58             int cnt=0;
 59             for(int i=0; i<j-1; i++)
 60             {
 61                 if(s1[i]!=0)
 62                     break;
 63                 else
 64                     cnt++;
 65             }
 66             for(int i=cnt; i<j; i++)
 67                 s2[t1++]=s1[i];
 68         }
 69         for(int i=len-1; i>=1; i--)
 70         {
 71             if((s[i]-0)%3==0)
 72                 continue;
 73             for(int j=i-1; j>=0; j--)
 74             {
 75                 int cnt=s[i]-0+s[j]-0;
 76                 if(cnt%3==num)
 77                 {
 78                     cnt2=i;
 79                     cnt3=j;
 80                     break;
 81                 }
 82             }
 83             if(cnt2!=-1&&cnt3!=-1)
 84                 break;
 85         }
 86         if(cnt2!=-1&&cnt3!=-1)
 87         {
 88             int j=0;
 89             for(int i=0; i<len; i++)
 90             {
 91                 if(i==cnt2||i==cnt3)
 92                     continue;
 93                     s11[j++]=s[i];
 94             }
 95             int cnt=0;
 96             for(int i=0; i<j-1; i++)
 97             {
 98                 if(s11[i]!=0)
 99                     break;
100                 else
101                     cnt++;
102             }
103             for(int i=cnt; i<j; i++)
104                 s3[t2++]=s11[i];
105         }
106         if(!a&&t1==0&&t2==0)//当数据中没有0而且去掉后没有数字时
107             cout<<-1<<endl;
108         else if(t1==0&&t2==0)
109             cout<<0<<endl;
110         else if(t1>=t2)
111             cout<<s2<<endl;
112         else
113             cout<<s3<<endl;
114     }
115     return 0;
116 }

 

以上是关于CodeForces - 792C的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 792C - Divide by Three [ 分类讨论 ]

CF792C Divide by Three

[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段

c_cpp Codeforces片段

Codeforces 86C Genetic engineering(AC自动机+DP)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)