前言
没想到,只有过3题的水平,都可以上蓝
传送门 :
A.M. Deviation
操作 : abc中任意选一个 让其中一个减一另一个加一
答案 : 使得最后答案 |a+c - 2*b| 最小
我们令 s u m = a + c sum = a+c sum=a+c 会发现 选这两个数进行操作的话,最终对于sum来说值是不变的 因此我们 的 a n s = ∣ s u m − 2 ∗ b ∣ ans = |sum - 2*b| ans=∣sum−2∗b∣
所以嘞 对于这个式子有两个情况 s u m + 1 − 2 ∗ ( b − 1 ) sum+1 - 2*(b-1) sum+1−2∗(b−1) 答案总体 +3
另一个答案总体 -3
因此这题的答案的最小值 要么是 0 或 者 ∣ − 1 ∣ = 1 0或者|-1|=1 0或者∣−1∣=1
因此我们只需要判断能否被3整除就行
CODE
int a,b,c;
cin>>a>>b>>c;
int d = abs(a+c -2*b);
if(d%3)
{
cout<<1<<endl;
return;
}
cout<<0<<endl;
return ;
B. Reverse Sort
这题是最不理性的一题 QAQ
对于这题答案只有 0和 1 (证明不出来)
我们知道最后的状态一定是 0在前面 1在后面
因此我们可以记录 0 和 1 的个数
然后枚举除 前c0( c 0 代 表 0 的 个 数 c0代表0的个数 c0代表0的个数) 中1的个数 就是不该出现在这里的
然后再处理除 c0 - c0+c1中0的个数 就是不该出现再这里的
然后输出答案即可
这很cf
CODE
vector<int> ans;
cin>>n;string s;cin>>s;
int c0 = 0 ,c1 = 0 ;
for(auto it : s)
{
if(it == '0') c0++;
else c1++;
}
for(int i = 0 ;i<=c0-1;i++)
if(s[i] != '0')
ans.pb(i+1);
for(int i = c0;i<=c0+c1-1;i++)
if(s[i] != '1')
ans.pb(i+1);
if(ans.size() == 0 )
cout<<0<<endl;
else
{
cout<<1<<endl;
cout<<ans.size()<<" ";
for(auto it:ans)
cout<<it<<" ";
cout<<endl;
}
C - Dominant Character
属于是水题了
我们可以发现答案的格式是 a…a
对于这个无非就以下几种状态
- aa
- aba,aca
- abca,acba
- abbacca,accabba
直接判断即可
CODE
void solve()
{
int n;cin>>n;
string s;cin>>s;
int ans = INF;
for(int i = 0;i<n;i++)
{
if(s[i] == 'a')
{
if(s[i+1] == 'a')
{
ans = min(ans,2);
}
if(s[i+1] == 'c'&& s[i+2] == 'a')
{
ans = min(ans,3);
}
if(s[i+1] == 'b'&& s[i+2] == 'a')
{
ans = min(ans,3);
}
if(s[i+1] == 'b' &&s[i+2] =='c' && s[i+3] =='a')
{
ans = min(ans,4);
}
if(s[i+1] == 'c' &&s[i+2] =='b' && s[i+3] =='a')
{
ans = min(ans,4);
}
if(s[i+1] == 'c' && s[i+2] =='c' && s[i+3] == 'a' &&s[i+4] == 'b' && s[i+5]=='b'&&s[i+6] == 'a')
{
ans = min(ans,7);
}
if(s[i+1] == 'b' && s[i+2] =='b' && s[i+3] == 'a' &&s[i+4] == 'c' && s[i+5]=='c'&&s[i+6] == 'a')
{
ans = min(ans,7);
}
}
}
if(ans!=INF)
cout<<ans<<endl;
else
cout<<-1<<endl;
}