Codeforces Round 1014 (Div. 2)
文章目录
- 2025.3.30 Div2
- A. Kamilka and the Sheep(gcd)
- 题意
- 思路
- 代码
- 题外话
- B. Lady Bug(01交换)
- 题意
- 思路
- C. +1-1数组最大值
- 题意
- 思路
- 代码
- 总结
2025.3.30 Div2
Dashboard - Codeforces Round 1014 (Div. 2) - Codeforces
A. Kamilka and the Sheep(gcd)
题意
给出一个数组,可以每个数字加上d。任选两个数字,得到最大公约数。
思路
如果是两个数a,b, 加上相同的数字,求他们的最大公约数x。
算一算就知道,max(x)=abs(a-b)
所以答案就是排序后a[n]-a[1]
代码
void solve()
{
int n,mx=0,j=0,k=0;
cin>>n;
fir(i,1,n)
{
cin>>a[i];
}
sort(a+1,a+n+1);
cout<<a[n]-a[1]<<'\n';
}
题外话
起初,想着数据小,暴力也可以,打算两两判断,想着d的取值。
这时已经联系到差值了,应该再多想一点,gcd该是多少,整个数组该怎么算。
后来还wa了一发,如此简单,羞愧、
B. Lady Bug(01交换)
题意
给出两个串a b, a i a_i ai可以和 b i − 1 b_{i-1} bi−1交换, b i b_i bi可以和 a i − 1 a_{i-1} ai−1交换。任意次操作后,是否可使第一个串全为0.
思路
终于通了!
昨天这道题卡我太长时间了,实在是无从下手。如今看来,肯定是当时太呆了 QWQ
与我而言,不易知,数字移动只有这两种轨迹。
对于绿色轨迹至少需要存在(n+1)/2 个0,黄色轨迹至少需要存在 n/2 个0
void solve()
{
int n,c1=0,c2=0;
string a,b;
cin>>n>>a>>b;
fir(i,0,n-1)
{
if(i&1)
{
if(a[i]=='0') c1++;
if(b[i]=='0') c2++;
}
else
{
if(a[i]=='0') c2++;
if(b[i]=='0') c1++;
}
}
if(c2>=(n+1)/2&&c1>=n/2)
cout<<"YES\n";
else
cout<<"NO\n";
}
C. +1-1数组最大值
题意
阿苏娜认为收到的礼物的美观程度为 max(a1,a2,…,an) 。她可以执行以下任意次数的操作(可能是零)。
- 1≤i≠j≤n 中的 ai+aj 为奇数和 ,ai>0 ,将 ai 减少 11 ,将 aj 增加 1 。
求最终数组的最大值。
思路
从奇偶的个数入手,可以发现最终奇数的个数是没有变化的。
- 所有数字的奇偶性相同,无法进行操作
- 至少一个奇数,偶数:
先留下一个偶数,将其他偶数累加到奇数上。此时用这个偶数依次和所有奇数进行操作
当原本的奇数为1时,停止操作。原来的偶数仍然为偶数,再接着和下一个奇数操作。
直至剩下最后一个奇数,将其减小为0.
所以答案是:sum-c(奇数)+1
代码
void solve()
{
int n,j=0,o=0,mx=0,sum=0;
cin>>n;
fir(i,1,n)
{
cin>>a[i];
if(a[i]&1) j++;
else o++;
mx=max(mx,a[i]);
sum+=a[i];
}
if(j==0||o==0)
cout<<mx<<'\n';
else
cout<<sum-j+1<<"\n";
}
总结
又是掉分的一场