Codeforces Round 891 (Div. 3)

Codeforces Round 891 (Div. 3)

A. Array Coloring

给你一个由n个整数组成的数组。是否可以将其所有元素着色为两种颜色,使得两种颜色的元素之和具有相同的奇偶性,并且每种颜色至少有一个元素着色。

两组都是奇数或者偶数

奇数+奇数=偶数 

偶数+偶数=偶数

奇数+偶数=奇数

只需判断数组中所有元素之和是否为奇数即可

void sovle() 
{
	ll i, n, t, cnt = 0;
	cin >> n;
	for(i = 0; i < n; i ++)
	{
		cin >> t;
		if(t % 2)
			cnt ++;
	} 
	if(cnt % 2)
		cout << "NO" << endl;
	else
		cout << "YES" << endl;
}
 

B. Maximum Rounding

给定一个自然数x,进行四舍五入,输出最大的那个数,进位之后该位为0

3451 -> 3450 -> 3500 -> 4000 -> 0000

进位到第k位,k位后面的数都变为0

如果k为0,说明每位都能进位就全会变为0(如999 -> 000 -> 1000),首尾要+1, s = '1' + s

void sovle() 
{
	ll i, k, n, f = 0;
	string s;
	cin >> s;
	n = s.size();
	k = n;
	for(i = n - 1; i >= 0; i --)
		if(s[i] + f >= '5')
		{
			f = 1;
			k = i;
		}
		else
		{
			s[i] += f;
			f = 0;
		}
	for(i = k; i < n; i ++)
		s[i] = '0';
	if(f)
		s = '1' + s;
	cout << s << endl;
}

C. Assembly via Minimums

有 n 个整数 a1,a2,…,an现在用所有 ai,aj 的最小值构造出一个长度为\frac{n(n-1)}{2}的 b数组。

已知b数组求a数组

对b数组排序,b数组中有 n−1 个最小数,n−2 个第 二小数,……,1 个第二大数,0 个最大数。

void sovle()
{
	ll i, n, m;
	cin >> n;
	m = n * (n - 1) / 2;
	for(i = 1; i <= m; i ++)
		cin >> a[i];
		
	sort(a + 1, a + m + 1);
	
	ll k = 1, j = n - 1;
	for(i = 1; i < n; i ++)
	{
		cout << a[k] << ' ';
		k += j;
		j --;
	}
	cout << a[m] << endl;//重复输出一次最大的
}

D. Strong Vertices

给定a, b数组,当且仅当 au−av ≥ bu−bv 时 u,v 有连边。求出所有能到达所有点的点。

改写成 au−bu ≥ av−bv,找出ai - bi 的最大值的次数及在第几行出现

void sovle() 
{
	ll n, i;
	cin >> n;
	for(i = 1; i <= n; i ++)
		cin >> a[i];
	for(i = 1; i <= n; i ++)
	{
		cin >> b[i];
		a[i] -= b[i];
		b[i] = a[i];
	} 
	sort(b + 1, b + n + 1);
	ll maxx = b[n], cnt = 0;
	for(i = 1; i <= n; i ++)
		if(a[i] == maxx)
			cnt ++;
	cout << cnt << endl;
	for(i = 1; i <= n; i ++)
		if(a[i] == maxx)
			cout << i << ' ';
	cout << endl;
}

你可能感兴趣的:(数据结构)