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

浙公网安备 33010602011771号