这题以前出现过
这题以前出现过
这题以前出现过
题目链接
题意
给你在一维坐标的三种城市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;
}
感觉这样说也不是很明白,下面给出一张图。红色的连边就是要进行处理的。判断这两种到底哪个总长度最短取哪个,就是核心的贪心思路。