A-Lucky Ticket
题意:第一行给一个数字n,代表数字的位数;第二行给出数字;规定数字的前一半部分的和与后一半部分的和相等,并且整个数字都是由7或者4构成的数字,我们称为幸运数,让你判断这个数字是不是幸运数,是的话就输出YES,不是则输出NO。
思路:按照题意进行模拟就可以,前一半部分和后一半部分的和可以用ascii来表示。
#include<bits/stdc++.h> using namespace std; int main() { int n; cin>>n; string t; cin>>t; int sum1 = 0,sum2 = 0; int flag = 0; for(int i = 0;i<n/2;i++) { sum1+=int(t[i]-'0'); }for(int i = n/2;i<n;i++) { sum2+=int(t[i]-'0'); } for(int i = 0;i < n;i++) { if(t[i]!='4'&&t[i]!='7') flag = 1; } if(sum1==sum2&&!flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; }
B-Lucky Mask
题意:给你两个数a和b,并且b是幸运数(定义见上一题),求一个最小的、比a大的数字c,让c的掩码等于b(掩码:数字中舍弃掉除了4和7的其他数字,剩下的由4和7组成的数字);
思路:从a+1开始,一个一个数字进行判断,如果掩码等于b那就输出(不会超市,因为两个相邻的数字差不超过67)
#include<bits/stdc++.h> using namespace std; string fun(int a) { string t; while(a) { if(a%10==4||a%10==7) { t+=a%10+'0'; } a/=10; } reverse(t.begin(),t.end()); return t; } int main(){ int a; string b; cin>>a>>b; int sum = a+1; while(fun(sum)!= b) { sum++; } cout<<sum<<endl; }
C-Lucky Conversion
题意:给你两个幸运数字(定义见A题)a和b,你可以进行两个操作:①将7替换成4或者将4替换成7;②交换b中的两个数字
求将a变成b的最小步数。
思路:求出a、b两个数字对应位置不同的数量,并且记录a的个数,输出a中4和7中数量多的那个数字。
#include<bits/stdc++.h> using namespace std; int main() { string a,b; cin>>a>>b; int a4n = 0,b4n = 0,a7n = 0,b7n = 0; for(int i = 0;i < a.length();i++) { if(a[i]!=b[i]) if(a[i]=='4') a4n++; else if(a[i]=='7') a7n++; }cout<<max(a7n,a4n)<<endl; }