題意:
有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 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int N=300010; 5 6 vector<int> 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<n;i++){ 20 cin>>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<mp[u].size();i++){ 34 int v=mp[u][i]; 35 if(a[v]==maxn-1) 36 cont++; 37 } 38 if(cont==mb) 39 ans=maxn; 40 else 41 ans=maxn+1; 42 cout<<ans<<endl; 43 } 44 else{ 45 bool flag=false; 46 for(int i=1;i<=n;i++){ 47 int cont=0; 48 if(a[i]==maxn) 49 cont++; 50 for(int j=0;j<mp[i].size();j++){ 51 int v=mp[i][j]; 52 if(a[v]==maxn) 53 cont++; 54 } 55 if(cont==ma) 56 flag=true; 57 } 58 if(flag){ 59 cout<<maxn+1<<endl; 60 } 61 else{ 62 cout<<maxn+2<<endl; 63 } 64 } 65 return 0; 66 }