E Byteland, Berland and Disputed Cities

E Byteland, Berland and Disputed Cities
题意:给你1,2,3,三种点,使其排列在x轴上,去掉点1后使其2,3点完全联通,去掉点2后使其1,3点完全联通,问最短需要多长。
思路:1和2两个点不用连,连了也得去掉。
那么如果只有一个3点,我们把3点看成1点,按顺序连一遍即可,同样2点也是如此。
如果有两个3点,那么第一个3点的最左面相同点挨着连即可,第二个3点的最右面也是如此,但是两个3点的中间只有两种连法,(1)从左面的3点出发连接中间的1点直到右面的3点+从左面的3点出发连接中间的2点直到右面的3点(2)两个3点直接连接+(从左面的3点出发连接中间的1点直到右面的3点-从左面的3点出发连接中间的1点直到右面的3点中的最大差值)+(从左面的3点出发连接中间的2点直到右面的3点-从左面的3点出发连接中间的2点直到右面的3点中的最大差值)。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=0x3f3f3f3f;
const int maxn=200005;
int n;
int br,bb,bp;
int main()
{
    while(~scanf("%d",&n))
    {
        int index;
        char c;
        ll ans=0;
        br=bb=bp=0;
        int lr,lb,lp;
        int maxr=0,maxb=0;

        for(int i=0; i<n; i++)
        {
            scanf("%d %c",&index,&c);
            //cout<<c<<endl;
            if(c=='P'||c=='R')
            {
                if(br)
                {
                    ans+=(index-lr);
                    maxr=max(maxr,index-lr);
                }

                lr=index;
                br=1;
            }
            //printf("ans=%d\n",ans);
            if(c=='P'||c=='B')
            {
                if(bb)
                {
                    ans+=(index-lb);
                    maxb=max(maxb,index-lb);

                }
                lb=index;
                bb=1;
            }
            //printf("ans=%d\n",ans);
            if(c=='P')
            {
                if(bp)
                {
                    ans+=min(0,index-lp-maxr-maxb);
                }
                maxr=0,maxb=0;
                lp=index;
                bp=1;
            }
            //printf("ans=%d\n",ans);
        }
        printf("%lld\n",ans);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值