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; }
----------------
----------------
----------------