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
- 796C
- Codeforces 796C 想法
- codeforce 796C
- 796C Bank Hacking
- codeforces 796C
- c
- c
- c
- c
- C
- c
- c
- c
- C+
- c
- C
- c
- c
- 关于RecyclerViewHeader实现
- Android 热修复Tinker 在项目中的使用
- 对象序列化
- php ajax跨域问题
- eclipse的安装及tomcat的配置
- 796C
- Java实现分页数据获取CachedRowSet
- recyclerview历史
- 进程间通信方式总结——共享内存
- Django账号绑定邮箱时发送链接
- 解决为什么写博客,写什么样的博客的问题
- 如何准备BAT技术面试答案(上)——Java研发方向
- 文章标题
- C++的const、指针、引用总结