A A.M. Deviation
在三元组\(a_1,a_2,a_3\)上定义d运算:\(d=|a_1+a_3-2a_2|\).
可以做任意多次如下操作:
选择\(a_1,a_2,a_3\)中两个数,将其分别+1和-1.
对于给定的\(a_1,a_2,a_3\) ,最小化\(d\) 的值.
容易发现结果只可能是0/1,只与和有关.
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
ios::sync_with_stdio(false);
int T=0;
cin>>T;
while (T--){
int a=0,b=0,c=0;
cin>>a>>b>>c;
if ((a+b+c)%3==0)
cout<<0<<endl;
else
cout<<1<<endl;
}
}
B Reverse Sort
给定一个01串,每次进行如下操作:
选择串中任意个数,它们形成不升序列,将它们对称翻转.
问将原序列变为不降序列的最少操作数.输出方案.
容易发现最多也只需要一次翻转,只需要找到左边的1和右边的0一样多的位置翻转即可.
代码写的很丑...
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1005;
int cnt,tot,a[N],n;
char c;
bool flag;
int main(){
int T;
cin>>T;
while (T--){
cnt=0,tot=0,flag=true;
cin>>n;
for (int i=1;i<=n;i++){
cin>>c;
a[i]=c-'0';
if (a[i]==1) tot++;
if (i!=1&&a[i]==0&&a[i-1]==1) {
flag=false;
}
}
if (tot==0||tot==n||flag){
cout<<0<<endl;
continue;
}
cout<<1<<endl;
for (int i=n;i>1;i--){
if (a[i]==1)
tot--;
else
cnt++;
if (tot==cnt){
cout<<tot+cnt<<" ";
for (int j=1;j<=i-1;j++)
if (a[j]==1)
cout<<j<<" ";
for (int j=i;j<=n;j++)
if (a[j]==0)
cout<<j<<" ";
cout<<endl;
break;
}
}
}
}
总结
深夜打比赛,状态很差,仅做出两题,rk5000+
,不太理想.
以后赛前要多睡觉.