Codeforces Deltix Round Summer 2021 [Div.1 + Div.2] problem-A-B题解

本文介绍了两道编程题目,第一题涉及从坐标(0,0)到(a,b)的最短路径计算,通过分析不同操作步数进行解答。第二题探讨如何通过最少交换次数将奇偶序列转换为奇偶相间的序列,考虑了不同情况下的最优策略。对于无法实现的情况,给出了判断标准。
摘要由CSDN通过智能技术生成

传送

1556A - A Variety of Operations

1556B - Take Your Places!


目录

A. A Variety of Operations

B. 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,(a,b)->(\frac{a+b}{2},\frac{a+b}{2})->(0,0);  

4.abs(a-b)%2!=0             结果为-1    (a,b)->(\frac{a+b}{2},\frac{a+b}{2})->(0,0);有误差,无法实现第一步。

 

#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
步数sumsum+=(dx1-dy1)sum+=(dx2-dy2)sum+=(dxi-dyi)

方法1:将序列变为  010101010101......的形式。   

vector<>a第1个不合适的数据(奇数数在奇下标上)的下标dx1第2个不合适的数据(奇数数在奇下标上)的下标dx2
vector<>b第1个不合适的数据(偶数在偶下标上)的下标dy1第2个不合适的数据(偶数在偶下标上)的下标dy2
步数sumsum+=(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;
    }
}

总结:

罚坐自闭小菜鸡。。。


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值