Codeforces Round #819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022 (A,B)(C补)

这场打的稀烂。。。

A. Mainak and Array

题意:将数组中某段子序列翻转一次,求a[n] - a[1]最大的值。

思路:有三种情况:
第一种,将最小的数翻转到第一位,然后用原来的a[n]减去反转后的a[1]。
第二种,将最大的数翻转到最后一位,用反转后的a[n]减去原来的a[1]。
第三种,整体翻转,使最大和最小两个数在a[n]和a[1]的位置,这就需要他们相邻。

代码:

void solve()
{	
	int n;
	cin >> n;
	int maxv = -INF, minv = INF;
	int ans = 0;
	for(int i = 1; i <= n; i ++)
	{
		cin >> a[i];
		maxv = max(maxv, a[i]);
		minv = min(minv, a[i]);
	}
	
	for(int i = 1; i < n;i ++)
	{
		ans = max(ans, a[i] - a[i + 1]);
	}
	ans = max(ans, max(maxv - a[1], a[n] - minv));
	
	cout << ans << endl;
}

B. Mainak and Interesting Sequence

题意:给出数组的位数n和数组元素总和m,求是否存在一个数组使得每个元素,在数组中严格小于它的数的异或值为0。

思路:我的思路就是均分,这样的话就只需要看位数就可以判断是否异或为0。首先将m均分给n个元素,多的值后面补上即可。
如果没有剩下的数,说明可以均分,那么绝对满足条件,输出即可。
如果有剩下的数,如果n - 1是偶数,那么说明可以在最后一位加上剩下的数,那么对于这位数而言,比他小的数异或为0。
如果n - 1不是偶数,设剩下的数为t,将t均分到t个数上,观察n - t是否为偶数,不为偶数则不满足条件,为偶数则满足条件。

代码:

void solve()
{	
	int n, m;
	cin >> n >> m;
	vector<int> v(n, m / n);
	if(m < n)                                //如果有数为0,则NO
	{
		cout << "No" <<endl;
		return ;
	}
	int t = m - (m / n * n);
	if(t == 0)
	{
		cout << "Yes" << endl;
		for(int i = 0; i < n; i++) cout << v[i] << " \n"[i == n - 1];
		return ;
	}
	
	if((n - 1) % 2 == 0)
	{
		cout << "Yes" << endl;
		for(int i = 0; i < n; i ++) 
		{
			if(i == 0) v[i] += t;
			cout << v[i] << " \n"[i == n - 1];
		}
		return ;
	}
	
	if((n - t) % 2 == 1)
	{
		cout << "No" << endl;
		return ;
	}
	
	
	cout << "Yes" <<endl;
	for(int i = 0; i < n; i ++)
	{
		if(i < t) v[i] ++;
		cout << v[i] << " \n"[i == n - 1];
	}
 
}

C. Jatayu's Balanced Bracket Sequence

题意:比赛的时候没读懂。后来看的题解。这位大佬写的不错

代码:

void solve()
{	
	int n;
	cin >> n;
	string s;
	cin >> s;
	n = 2 * n;
	int res = 1;
	for(int i = 0; i < n; i ++)
	{
		if(s[i] == '(') continue;
		int j = i;
		while(j + 1 < n && s[j + 1] == ')') j ++;
		res += j - i;
		i = j;
	}
	cout << res << endl;
}
posted @ 2022-09-07 15:50  nobodyL  阅读(108)  评论(0)    收藏  举报