A、小红的整数操作
跳转原题点击此:A题地址
1、题目大意
给定一个数组和一个数k,问你通过对任意数组中的数加上若干次k,使得最终数组中相同的数最多,问你最多数是多少。
2、题目解析
因为要加上若干个k,使得最终数组的相同数最多。所以,我们只需要找到每个数对k取模的结果,最后这个取模的结果的数最多的就是答案。因为无论加上多少个k,对k取模后,加上的若干个k都会被消除。我们只需要找到模的差异即可。
比如给出的案例中,1、3、5对k(k为2)取模的结果就是1,而2、4取模的结果为0。所以最多相同的数就是3。
3、具体代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
int T;
int n, k;
void solve()
{
cin >> n >> k;
vector<int> a(n + 1, 0);
vector<int> b(k + 1, 0); // 注意,b数组要开k个大小
for(int i = 1; i <= n; i++)
cin >> a[i];
int ans = 0;
for(int i = 1; i <= n; i++)
{
int tmp = a[i] % k;
b[tmp] ++;
ans = max(ans, b[tmp]);
}
cout << ans << endl;
}
int main()
{
solve();
return 0;
}
B、小红的01串
跳转原题点击此:B题地址
1、题目大意
有一个01串,可以对一个长度为2的字串取反(0变为1,1变为0),问你经过若干次操作后,所有的字符能否一样。
2、题目解析
我们发现,当有偶数个0或者1时,可以通过有限个操作将这偶数个0和1变为相反的数。如果想要将第i和第j的元素相反,此时只需要对\(i\sim j\)这个区间的字符依次取反即可,此时我们发现,这个区间中只有i和j经过了1次反转,而其他字符经过了两次反转没变。
案例、10101,想要将2和4的0(0为偶数个)变为1,只需要依次对(2,3),(3,4)取反即可,这时3取反两次没变,而2、4则取反了。
3、具体代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5+10;
int T;
int n;
int f[N];
void solve()
{
string s;
int zero = 0, one = 0;
cin >> s;
for(auto t : s)
{
if(t == '0')
zero ++;
else
one ++;
}
// 因为可以通过若干次的操作,将偶数个的0/1变为1/0。
if(zero % 2 == 0 || one % 2 == 0)
cout << "Yes\n";
else
cout << "No\n";
}
int main()
{
cin >> T;
while (T--)
{
solve();
}
return 0;
}