Codeforces792C【构造】

来源:互联网 发布:iphone不能用蜂窝数据 编辑:程序博客网 时间:2024/05/29 14:42

题意:

一个美丽的数就是不含前导0,而且是3的倍数。
现在给你一个n,问去掉最少的数使得变成一个美丽的数。

思路:

对于原先的数,把每位数的求和然后%3,
1. =0,直接输出。
2. =1,去掉一个1/去掉两个2,不满足的输出-1
3. =2,去掉一个2/去掉两个1,不满足的输出-1
4. 注意处理完可能是空串或者含前导零。

Code:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<stack>#include<queue>#include<deque>#include<map>#include<algorithm>using namespace std;typedef long long LL;//#pragma comment(linker, "/STACK:102400000,102400000")const double PI = acos(-1.0);const double eps = 1e-6;const int INF=0x3f3f3f3f;const int N=100010;const int mod = 1e9+7;char s[N];int a[N];string ans;string a1,a2;string Print(){    string temp="";    int len = ans.length();    reverse(ans.begin(),ans.end());    int i=0;    while(ans[i]=='0')        i++;    if(i==len) temp.push_back('0');    else{        while(i<len)        {            temp.push_back(ans[i]);            i++;        }    }    return temp;}int main(){    scanf("%s",s);    int len = strlen(s);    int sum = 0;    int num1,num2;    num1=num2= 0;    for(int i = 0; i < len; i++)    {        a[i] = (s[i]-'0')%3;        sum += a[i];        if(a[i] == 1)            num1++;        else if(a[i] == 2)            num2++;    }    sum %= 3;    if(sum == 0){        puts(s);        return 0;    }    int f;    if(sum==2){        ans = "";        a1="";        a2="";        f=0;        for(int i=len-1;i>=0;i--){            if(f<2 && a[i]==1)                f++;            else ans.push_back(s[i]);        }        if(f==2&&ans.length()) a1=Print();        ans = "";        f=0;        for(int i=len-1;i>=0;i--){            if(f<1 && a[i]==2)                f++;            else ans.push_back(s[i]);        }        if(f==1 && ans.length()) a2=Print();        if(a1.length()>a2.length()) cout<<a1;        else if(a2.length()) cout<<a2;        else puts("-1");    }    else    {        ans = "";        a1="";        a2="";        f=0;        for(int i=len-1;i>=0;i--){            if(f<2 && a[i]==2)                f++;            else ans.push_back(s[i]);        }        if(f==2 && ans.length()) a1=Print();        ans = "";        f=0;        for(int i=len-1;i>=0;i--){            if(f<1 && a[i]==1)                f++;            else ans.push_back(s[i]);        }        if(f==1 && ans.length()) a2=Print();        if(a1.length()>a2.length()) cout<<a1;        else if(a2.length()) cout<<a2;        else puts("-1");    }    return 0;}