hdu oj 6020 求给出一串数和一个K任意去点掉k个数能否被三整除(思维)

来源:互联网 发布:购物中心数据分析 编辑:程序博客网 时间:2024/04/25 13:12

MG是一个财富爆表的男孩子。他拥有
N(1<=N<=100000)
N(1<=N<=100000)个苹果,每个苹果上标有一个数字
0~9 ,代表它的价值。
一个合法的数字是不含有前导零的,这 n
n个苹果恰好排成了一个合法的N位数。
MG拥有拿去 K个苹果的权利(0<=K

#include<bits/stdc++.h>#define ll long long#define inf 0x3f3f3f3fusing namespace std;typedef pair<int,int>P;const int MAXN=100010;int gcd(int a,int b){    return b?gcd(b,a%b):a;}string s;int num[MAXN];int S[3];int main(){    std::ios::sync_with_stdio(0);    int A,B,C,n,k,T,t;    bool flag0,flag1,E1,E2;    cin>>T;    while(T--)    {        flag0=flag1=t=0;        S[0]=S[1]=S[2]=0;        E1=E2=0;        int sum=0;        cin>>n>>k;        cin>>s;        for(int i=0; i<s.size(); i++)        {            num[i]=(s[i]-'0')%3,sum+=s[i]-'0';            S[num[i]]++;            if(!num[i]&&s[i]!='0') flag0=1;            if(s[i]=='0')flag1=1;            if(!flag0&&s[i]=='0')                t++; //记录前导零的个数            if(!flag1&&num[i]==1)                E1=1;            if(!flag1&&num[i]==2)                E2=1;        }        bool flag=0;        if(!flag0)t--;        for(C=0; C<=min(k,S[2]); C++)        {            B=(sum-C*2)%3;            while(B<=min(k,S[1])&&B+C<=k)            {                A=k-B-C;                if(A<=S[0])                    if(A>=t||(E1&&B<S[1])||(E2&&C<S[2]))                    {                        cout<<"yes\n";                        flag=1;                        break;                    }                B+=3;            }            if(flag)                break;        }        if(!flag)            cout<<"no\n";    }    return 0;}
0 0
原创粉丝点击