796C

来源:互联网 发布:微信mac版 编辑:程序博客网 时间:2024/06/07 07:30

题意:有N个银行,每个银行的的 xx值 为 a[i] , 银行i被hack 需要的值 为 >=a[i] ,如果银行i被hack,那么 i的邻接银行j的 xx值加1,并且j的xx值加1。问需要最小的值,hack所有的银行。

答案只可能 三种 m, m+1,m+2;

考虑 m + 2 , 如果考虑从i点hack, 辣么i和i的邻接 值 等于 m 的数量< m的所有数量的话, 则必然 有一个m的值要加2.

考虑 m+1 , 如果考虑从i点hack, 辣么i的邻接值出现m的话,则必有一个m+1. 或 m 的临接点值等于m-1的数量 < m-1的所有数量,则必有一个m-1+2.

#include <bits\stdc++.h>using namespace std;const int maxn = 3*1e5+5;#define INF -1e9;vector<int> G[maxn];int a[maxn],n; int slove(){    int x = 0, y = 0;    int maxval = INF;    for(int i=1;i<=n;i++){        if(a[i]>maxval) maxval = a[i];    }    for(int i=1;i<=n;i++){        if(a[i]==maxval) x++;        if(a[i]==maxval-1) y++;    }    int xx = x, yy = y;    int flag1=1, flag2=1;     for(int i=1;i<=n;i++){        int flag3 = 1;        if(a[i]==maxval) x--;        else if(a[i]==maxval-1) y--;          for(int j=0;j<G[i].size();j++){            if(a[ G[i][j] ] == maxval){                 x--;                 flag3 = 0;            }            if(a[ G[i][j] ] == maxval-1) y--;          }          if(x==0){            flag1 = 0;            if( y==0&&flag3) flag2=0;           }           x = xx, y = yy;     }     if(flag1 == 0) {        if(flag2 == 0) return maxval;        else return maxval+1;     }     else return maxval+2;}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++) scanf("%d",&a[i]);    for(int i=1;i<n;i++){        int x,y; scanf("%d%d",&x,&y);        G[x].push_back(y);        G[y].push_back(x);     }    int ans = slove();    printf("%d\n",ans);    return 0;} 
0 0
原创粉丝点击