Codeforces 962E

这题以前出现过

这题以前出现过

这题以前出现过

题目链接

题意

给你在一维坐标的三种城市R,B,P,连接总和最短的边,使得只看城市RP或者只看城市BP,都要是相互连通的。

题解

莫名其妙962E和goodbye2017上的F题是一样的。。在解决这道题的时候呢主要用到的是一个分类讨论然后贪心。感觉直接讲讲不清楚,直接给代码然后注释。
PS:代码是经过压行的,容易引起不适。

#include<iostream>
using namespace std;
long long a,n,m,i,R,d,c,f,v,g,B,P;
char s;
main(){
    cin>>n;
    for(i=1;i<=n;++i){
        cin>>m>>s;
        if(s=='P'||s=='R'){//a是就是ans
            if(R) a+=m-d,c=max(c,m-d);R=1;d=m;//如果在这个点之前出现过P或者R就连一条边,c记录最长边
        }
        if(s=='P'||s=='B'){
            if(B) a+=m-f,v=max(v,m-f);B=1;f=m;//同上
        }
        if(s=='P'){
            if(P) a+=min(0ll,m-g-c-v);g=m;P=1;c=v=0;//当第二个P出现时就要进行判断,到底是
        }//跟上面一样P和RB都连起来还是切断R和B的最长边,连接两个P短。这两者取最短。
    }
    cout<<a;
}

感觉这样说也不是很明白,下面给出一张图。红色的连边就是要进行处理的。判断这两种到底哪个总长度最短取哪个,就是核心的贪心思路。

猜你喜欢

转载自www.cnblogs.com/jiaangk/p/9203832.html