Codeforces Round #104 (Div. 2) //缺E

----------------

A. Lucky Ticket

---

判断给出的数字是不是两半和相等的幸运数字。

---

#include <iostream>

using namespace std;

int main()
{
    int n;
    char s[111];
    cin>>n>>s;
    bool ok=true;
    for (int i=0;i<n;i++){
        if (s[i]!='4'&&s[i]!='7'){
            ok=false;
            break;
        }
    }
    if (!ok) cout<<"NO"<<endl;
    else{
        int a=0,b=0;
        for (int i=0;i<n;i++){
            if (i<n/2) a+=s[i]-'0';
            else b+=s[i]-'0';
        }
        if (a==b) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}
----------------

B. Lucky Mask

---

找到比a大的最小的能砍成幸运数字的数字是多少。

---

#include <iostream>
#include <cmath>
using namespace std;
bool check(int a,int b){
    int n=0;
    int i=1;
    while (a>0){
        int t=a%10;
        a/=10;
        if (t==4||t==7){
            n=t*i+n;
            i*=10;
        }
    }
    if (n==b) return true;
    return false;
}
int main()
{
    int a,b;
    cin>>a>>b;
    if (a<b) cout<<b<<endl;
    else{
        do{
            a++;
        }while (!check(a,b));
        cout<<a<<endl;
    }
    return 0;
}
----------------

C. Lucky Conversion

---

两个只含有幸运数字的串。

有两种操作,交换任意两个数字的位置,改变一个数字。

求使两串相等的最小操作数。

贪心,先尽可能的交换,然后改变剩下不相等数字的值。

---

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[111111],b[111111];
int main()
{
    cin>>a>>b;
    int n=strlen(a);
    int res=0;
    int x=0,y=0;
    for (int i=0;i<n;i++){
        if (a[i]!=b[i]){
            if (a[i]=='4') x++;
            else y++;
        }
    }
    res=max(x,y);
    cout<<res<<endl;
    return 0;
}
----------------

D. Lucky Number 2

---

给出4、7、47、74出现的次数。构造最小序列。

首先考虑将47、74拼接成4747474...的形式。

若4的数量与47相等。。则拼成74747的形式。

将剩下的4插入第一个4的位置里。将剩下的7插入最后一个7的位置里。

若某步中出现负数则说明不存在序列。

---

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int a1,a2,a3,a4;
char s[2111111];
char tmp[2111111];
char ad4[2111111];
char ad7[2111111];
int l4,l7;
int len,cnt;
bool solve(){
    len=0;
    if (abs(a3-a4)>1) return false;
    if (a3==0&&a4==0&&a1*a2!=0) return false;
    int c4=0,c7=0;
    if (a3>a4){
        for (int i=0;i<a3;i++){
            s[len++]='4';
            s[len++]='7';
            c4++,c7++;
        }
    }
    else if (a3<a4){
        for (int i=0;i<a4;i++){
            s[len++]='7';
            s[len++]='4';
            c4++,c7++;
        }
    }
    else{
        if (a1<=a3){
            for (int i=0;i<a4;i++){
                s[len++]='7';
                s[len++]='4';
                c4++,c7++;
            }
            s[len++]='7';
            c7++;
        }
        else{
            for (int i=0;i<a3;i++){
                s[len++]='4';
                s[len++]='7';
                c4++,c7++;
            }
            s[len++]='4';
            c4++;
        }
    }
    a1=a1-(c4);
    a2=a2-(c7);
    if (a1<0||a2<0) return false;
    l4=l7=0;
    for (int i=0;i<a1;i++) ad4[l4++]='4';
    for (int i=0;i<a2;i++) ad7[l7++]='7';
    ad4[l4]=0;
    ad7[l7]=0;
    if (a3==0&&a4==0){
        if (a1>0) strcpy(s,ad4);
        else if (a2>0) strcpy(s,ad7);
        return true;
    }
    cnt=0;
    //cerr<<"text "<<s<<endl;
    if (a1>0){
        for (int i=0;i<len;i++){
            tmp[cnt++]=s[i];
            if (s[i]=='4'){
                for (int j=0;j<l4;j++){
                    tmp[cnt++]=ad4[j];
                }
                for (int j=i+1;j<len;j++){
                    tmp[cnt++]=s[j];
                }
                break;
            }
        }
        tmp[cnt]=0;
        //strcpy(s,tmp);
        for (int i=0;i<=cnt;i++) s[i]=tmp[i];
        s[cnt]=0;
        len=cnt;
    }
    cnt=0;
    if (a2>0){
        int p=0;
        for (p=len-1;p>=0;p--){
            if (s[p]=='7') break;
        }
        //cerr<<"p="<<p<<endl;
        //cerr<<"ad7 "<<ad7<<endl;
        //cerr<<s<<endl;
        for (int i=0;i<len;i++){
            tmp[cnt++]=s[i];
            //cerr<<tmp[cnt-1]<<endl;
            if (i==p){
                //cerr<<"move!"<<endl;
                for (int j=0;j<l7;j++){
                    tmp[cnt++]=ad7[j];
                    //cerr<<tmp[cnt-1]<<endl;
                }
                for (int j=i+1;j<len;j++){
                    tmp[cnt++]=s[j];
                }
                break;
            }
        }
        tmp[cnt]=0;
        //cerr<<"templa "<<tmp<<endl;
        for (int i=0;i<=cnt;i++) s[i]=tmp[i];
        //strcpy(s,tmp);
        s[cnt]=0;
        len=cnt;
    }
    return true;
}

int main()
{
    cin>>a1>>a2>>a3>>a4;
    if (!solve()) cout<<-1<<endl;
    else cout<<s<<endl;
    return 0;
}


----------------


----------------


----------------

posted on 2013-09-08 21:38  电子幼体  阅读(134)  评论(0编辑  收藏  举报

导航