题意:先给出一个幸运数的概念:一个数是幸运数,当且仅当这个数只由4或者7组成,然后给出一个数,要你判断这个数是否满足条件,他必须是幸运数同时他的前半部分的数的和和后半部分数的和相等
思路:其实就是模拟,先构造一个字符串为"47",用字符串读进这个数,判断他的每一位是否都是"47"的子串,有不是的直接输出"NO",再记录和就行(挺简单的)
代码:
void solve()
{
cin >> n;
cin >> s;
string t = "47";
int sum1 = 0, sum2 = 0;
s = " " + s;
for (int i = 1; i <= (s.size() - 1) / 2; i++)
{
sum1 += s[i] - '0';
if (t.find(s[i]) == -1)
{
cout << "NO" << endl;
return;
}
}
for (int i = (s.size() - 1) / 2 + 1; i <= (s.size() - 1); i++)
{
sum2 += s[i] - '0';
if (t.find(s[i]) == -1)
{
cout << "NO" << endl;
return;
}
}
if (sum1 == sum2)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
题意:给你一个数a,b,其中b是幸运数,要你找到一个最小的c满足c>a同时c的码和b的一样,码指的就是一个数从左到右中是4或者7的数的组合(按照原来的顺序),
题意:其实判断下就行,如果a<b,那么这个数肯定是b,如果a>b,则就暴力模拟就行,每次让a++,再判断a的码是不是和b的相同就行
代码:
void solve() // 找到一个大于a的最小的c使得c的幸运数和b相同
{
cin >> a >> b;
if (a < b)
cout << b << endl;
else
{
while (1)
{
a++;
string sum = to_string(a);
string temp = to_string(b);
string s = "";
for (auto it : sum)
if (it == '4' || it == '7')
s += it;
if (s == temp)
{
cout << a << endl;
return;
}
}
}
}
题意:给你两个长度相同的字符串a,b,只含有4和7,你每次可以进行一下操作:1将一个数反转,就是4变成7,7变成4, 2交换两个数的位置,问你最少进行多少次操作可以让a等于b
思路:其实很容易想到先进行交换(可以减少两个不同的位置),再进行反转即可,所以只要统计下不同的位置中4和7的数量。然后取最大值就行
代码:
void solve() // 找到一个大于a的最小的c使得c的幸运数和b相同
{
string a, b;
cin >> a >> b;
int cnt1 = 0, cnt2 = 0; // 不一样的1,记录4 2 记录7的
for (int i = 0; i < a.size(); i++)
{
if (a[i] != b[i])
{
if (a[i] == '4')
cnt1++;
else
cnt2++;
}
}
cout << max(cnt1, cnt2) << endl;
}