传送
1556A - A Variety of Operations
1556B - Take Your Places!
目录
A. A Variety of Operations
解释:
题意:(0,0)->(a,b)需要几步。只有(+x,+x),(+x,-x),(-x,+x)三种运算;
分析:(0,0)->(a,b)需要几步等价与(a,b)->(0,0)需要几步。那么有相反的(-x,-x),(+x,-x),(-x,+x)三种运算;
考虑(a,b)->(0,0);
分类讨论:
1.a==b==0 结果为0,显然。
2.a==b!=0 结果为1,显然。
3.abs(a-b)%2==0 结果为2,
4.abs(a-b)%2!=0 结果为-1 有误差,无法实现第一步。
#include <bits/stdc++.h>
typedef long long int LL;
using namespace std;
LL t,a,b;
int main()
{
cin>>t;
while(t--)
{
cin>>a>>b;
if(a==0&&b==0)
{
cout<<0<<endl;
continue;
}
if(a==b)
{
cout<<1<<endl;
continue;
}
LL dx=abs(a-b);
if(dx%2==0)
{
cout<<2<<endl;
continue;
}
else
{
cout<<-1<<endl;
continue;
}
}
}
B. Take Your Places!
解释:
题意:将奇偶序列变成奇偶相间的序列。一次交换两个数,求最小总次数。
1.先把奇偶序列问题变成01串问题。偶数变成0,奇数变成1。例如: 6 2 3 4 5 1 ----- 0 0 1 0 1 1
*2.可以推出:因为一次交换两个数的限制条件,想要达到swap(a[i],a[j])的效果,需要(j-i)次。
3.
变化方法1: 将序列变为 101010101010......的形式。
变化方法2: 将序列变为 010101010101......的形式。
4.不可能的时候(输出-1):
n%2==0时,奇数个数!=偶数个数 ;
n%2==1时,abs(奇数个数-偶数个数!=1)
5.
用vector记录。
方法1:将序列变为 101010101010......的形式。
vector<>a | 第1个不合适的数据(偶数在奇下标上)的下标dx1 | 第2个不合适的数据(偶数在奇下标上)的下标dx2 | |||||
vector<>b | 第1个不合适的数据(奇数在偶下标上)的下标dy1 | 第2个不合适的数据(奇数在偶下标上)的下标dy2 | |||||
步数sum | sum+=(dx1-dy1) | sum+=(dx2-dy2) | sum+=(dxi-dyi) |
方法1:将序列变为 010101010101......的形式。
vector<>a | 第1个不合适的数据(奇数数在奇下标上)的下标dx1 | 第2个不合适的数据(奇数数在奇下标上)的下标dx2 | |||||
vector<>b | 第1个不合适的数据(偶数在偶下标上)的下标dy1 | 第2个不合适的数据(偶数在偶下标上)的下标dy2 | |||||
步数sum | sum+=(dx1-dy1) | sum+=(dx2-dy2) | sum+=(dxi-dyi) |
注意:若a.size()!=b.size() 则表示该种变化不行,一定是另一种变化。
如数据:
3
6 6 1
#include <bits/stdc++.h>
#define bbn 100005
#define maxint 2147483647
typedef long long int LL;
using namespace std;
LL t,n,a[bbn];
int main()
{
cin>>t;
while(t--)
{
LL cnt1=0,cnt2=0;
scanf("%lld",&n);
for(LL i=1; i<=n; i++)
{
scanf("%lld",&a[i]);
if(a[i]%2==0)
{
a[i]=0;
}
else
{
a[i]=1;
}
if(a[i]==0)
{
cnt2++;
}
else
{
cnt1++;
}
}
if(n%2==0)
{
if(cnt1!=cnt2)
{
cout<<-1<<endl;
continue;
}
}
else
{
if(abs(cnt1-cnt2)!=1)
{
cout<<-1<<endl;
continue;
}
}
LL sum1=0,sum2=0;
vector<LL> dx,dy;
for(LL i=1; i<=n; i++)
{
if(i%2==0)
{
if(a[i]==1)
{
dy.push_back(i);
}
}
else
{
if(a[i]==0)
{
dx.push_back(i);
}
}
}
if(dx.size()==dy.size())
{
for(int i=0; i<dx.size(); i++)
{
sum1+=abs(dx[i]-dy[i]);
}
}
else
{
sum1=maxint;
}
dx.clear();
dy.clear();
for(LL i=1; i<=n; i++)
{
if(i%2==0)
{
if(a[i]==0)
{
dy.push_back(i);
}
}
else
{
if(a[i]==1)
{
dx.push_back(i);
}
}
}
if(dx.size()==dy.size())
{
for(int i=0; i<dx.size(); i++)
{
sum2+=abs(dx[i]-dy[i]);
}
}
else
{
sum2=maxint;
}
//cout<<sum1<<"::"<<sum2<<endl;
cout<<min(sum1,sum2)<<endl;
}
}
总结:
罚坐自闭小菜鸡。。。