Educational Codeforces Round 135 (Rated for Div. 2) abc

A. Colored Balls: Revisited

题意:有n种颜色,每个颜色有cnti个,每次可以取两个不同颜色,问反复操作后,到什么颜色不能再取。

思路:找到最大的cnti就好了,记录它的下标输出即可。比最大值小的颜色一定可以通过相互取而取完。

代码:

void solve()
{
	int n;
	cin >> n;
	int maxv = -INF;
	for(int i = 1; i <= n;i ++)
	{
		cin >> a[i];
	}
	int idx = -1;
	for(int i= 1; i <= n; i++)
	{
		if(maxv < a[i])
		{
			idx = i;
			maxv = a[i];
		}
	}
	
	cout << idx << endl;
}


B. Best Permutation

题意:开始的时候x==0,经过一系列操作后,要求x最大。
具体操作为 给一个任意顺序的排列,如果当前数比x大则将它加到x上,否则x=0;

思路:通过观察可知,x最大能取到的值为2 * n - 1.
而这个值直接用(n - 1) + n即可。也就是后两位数不动。
我们需要保证x一定能加上后两位数,也就说明x在倒数第三位数的时候一定得为0
于是有两种情况,当n为偶数,直接将前面(n - 2)位数每两位swap一下,这样一定为0
第二种情况是n为奇数,前(n - 2)位数为奇数,那么就保持第一位不动,从第二位开始每两位swap,也可以保证后续为0

代码:

void solve()
{
	int n;
	cin >> n;
	
	for(int i = 1; i <= n; i ++) a[i] = i;
	
	if(n % 2 == 1)
	{
		for(int i = 2; i <= n - 3; i += 2)
		{
			swap(a[i], a[i + 1]);
		}
	}
	else{
		for(int i = 1; i <= n - 3; i += 2)
		{
			swap(a[i], a[i + 1]);
		}
	}
	
	for(int i = 1; i <= n;i ++) cout << a[i] << " \n"[i == n];
}


C. Digital Logarithm

第三题我开始一直在模拟,然后没写出来。看了题解才知道是数据结构。。。

题意:给出序列a,b。要求通过操作后能使a,b序列相等。问最小操作次数是多少
具体操作为: 将一个数变为它的位数,如1000,操作后为4,4操作后为1.

思路:使用priority_queue,使队列能进行自动排序,然后逐个比较,从最大位开始比较,如果不相等,那么将大的数转换为它的位数,然后重新入队。
如果相等,则两个数同时出队

代码:

int getlen(int n)
{
	int res = 0;
	while(n)
	{
		n /= 10;
		res ++;
	}
	
	return res;
}

void solve()
{
	int n;
	cin >> n;
	priority_queue<int> a, b;
	for (int i = 1; i <= n; i ++)
	{
		int x;
		cin >> x;
		a.push(x);
	}
	
	for (int i = 1; i <= n; i ++)
	{
		int x;
		cin >> x;
		b.push(x);
	}
	
	int ans = 0;
	
	while(!a.empty() || !b.empty())
	{
		if(a.top() == b.top())
		{
			a.pop();
			b.pop();
		}
		else{
			ans ++;
			if(a.top() > b.top())
			{
				int x = a.top();
				x = getlen(x);
				a.pop();
				a.push(x);
			}
			else{
				int x = b.top();
				x = getlen(x);
				b.pop();
				b.push(x);
			}
		}
	}
	
	cout << ans << endl;
}
posted @ 2022-09-09 19:14  nobodyL  阅读(38)  评论(0)    收藏  举报