題意:
有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 }
