题意:
有n家银行,每个银行都有自己的权值,当我们攻击一个银行时,跟他距离为1和2的银行权值都会+1。只有在我们本身权值大于银行权值时才可以攻击,求本身至少需要多少权值。
可以将所有的银行关系看成一棵树,则与根节点距离为一的银行最终会+1,其余的+2.
由此我们就有maxn,maxn+1,maxn+2三种可能的结果。
当最大值maxn只有一个时,若所有maxn-1距离maxn都为1,则本身需要maxn,否则需要maxn+1。
当最大值大于一个时,若存在一点,其本身和距离为1的点包含了所有maxn,则只需要maxn+1,
否则maxn+2。
附AC代码:
1 #include2 using namespace std; 3 4 const int N=300010; 5 6 vector mp[N]; 7 int a[N]; 8 9 10 int main(){11 int n,x,y,u,ans;12 int maxn=-1000000010;13 cin>>n;14 for(int i=1;i<=n;i++){15 mp[i].clear();16 cin>>a[i];17 maxn=max(a[i],maxn);18 }19 for(int i=1;i >x>>y;21 mp[x].push_back(y);22 mp[y].push_back(x);23 }24 int ma=0,mb=0;25 for(int i=1;i<=n;i++){26 if(a[i]==maxn)27 ma++,u=i;28 if(a[i]==maxn-1)29 mb++;30 }31 if(ma==1){32 int cont=0;33 for(int i=0;i