牛客周赛:26

发布时间 2023-12-31 20:27:16作者: Tom-catlll

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

 

后面就不会了,emmm