Codeforces Round #408 (Div. 2) -- C. Bank Hacking(分类讨论)
来源:互联网 发布:淘宝求购区在哪里 编辑:程序博客网 时间:2024/06/06 14:54
题意:
给你一个树状图的银行结点, 你要攻击所有的银行, 每个银行有一个权值wi, 攻击这个银行你需要能力值为wi, 你攻击一个银行,那么这个银行相邻的银行的权值+1,间接相邻 的银行权值也加1, 这里的间接相邻指的是: 如果i 和j 间接相邻,那么必然存在一个没被攻击的k 使得i与k 相邻, k 与j 相邻。
思路:
找找规律便发现:
如果从某个结点i 开始 攻击的话,那么和i 直接相邻的点 需要w+1的能力值, 其余的都是 w+2
那么 我们就可以分类讨论了:
假设所有结点权值最大值是m
1.如果答案是w: 那么只能是只有一个m,并且所有的m-1 与m 相邻。
2.如果答案是w+1:那么必须存在一个点 连接着所有的m,并且必须从这个点开始攻击。
3. 其余情况均是w+2
如果不分类讨论的话 直接拿一个set 模拟这个过程也可以:
#include <bits/stdc++.h>#define Siz(x) (int)x.size()using namespace std;const int maxn = 3e5 + 7;const int oo = 1e9 + 7;int a[maxn];vector<int>g[maxn];int m,n;vector<int>v[2];int solve(){ int sum1 = 0,sum0 = 0; for (int i = 1; i <= n; ++i){ if (a[i] == m){ v[1].push_back(i); sum1++; } else if (a[i] == m-1){ v[0].push_back(i); sum0++; } } if (sum1 == 1){ int sum = 0; int p = v[1][0]; for (int i = 0; i < Siz(g[p]); ++i){ int w = g[p][i]; if (a[w] == m-1) ++sum; } if (sum == sum0) return m; return m+1; } bool ok = 0; for (int i = 1; i <= n; ++i){ int sum = 0; if (a[i] == m) ++sum; for (int j = 0; j < Siz(g[i]); ++j){ int w = g[i][j]; if (a[w] == m)++sum; } if (sum == sum1) { ok = 1; break; } } if (ok) return m + 1; return m+2;}int main(){ scanf("%d",&n); m = -oo; for (int i = 1; i <= n; ++i) { scanf("%d",a+i); m = max(m,a[i]); } for (int i = 1; i < n; ++i){ int u,v; scanf("%d %d",&u, &v); g[u].push_back(v); g[v].push_back(u); } int ans = solve(); printf("%d\n",ans); return 0;}/**51 2 3 4 51 22 33 44 55738 -29 87 93 39 28 -551 22 53 22 41 77 69351 2 7 6 71 55 33 42 48**/
0 0
- Codeforces Round #408 (Div. 2) C. Bank Hacking(分类讨论)
- Codeforces Round #408 (Div. 2) -- C. Bank Hacking(分类讨论)
- Codeforces Round #408 (Div. 2)-C. Bank Hacking-(三种方法)分类讨论,二分,集合
- Codeforces Round #408 (Div. 2) C.Bank Hacking【思维+分类讨论】
- Codeforces Round #408 (Div. 2) C. Bank Hacking(二分)
- codeforces round#408(div.2) C. Bank Hacking
- Codeforces Round #408 (Div. 2) C. Bank Hacking
- Codeforces Round #408 (Div. 2) C. Bank Hacking
- Codeforces Round #408 (Div. 2) C. Bank Hacking 无根树、贪心、枚举
- Codeforces Round #408 C. Bank Hacking
- codeforces round #408 C. Bank Hacking
- codeforce 796 c Bank Hacking (思维题,分类讨论)
- Codeforces Round #408 /Mcvi Round #8 C Bank Hacking
- Codeforces Round #377 (Div. 2) C. Sanatorium 分类讨论
- Codeforces Round #379 (Div. 2) -- C. Anton and Making Potions(简单的分类讨论 + 二分)
- codeforces-796C-Bank Hacking(贪心)
- Codeforces Round #279 (Div. 2)C. Hacking Cypher
- Codeforces Round #279 (Div. 2) C. Hacking Cypher
- 通过断点调试lua
- C++ Primer(第五版)练习3.35
- 【Android学习】2017/04/12 开始Android学习
- spark中会遇到的一些名词
- C++重载运算符及const成员函数简述
- Codeforces Round #408 (Div. 2) -- C. Bank Hacking(分类讨论)
- MapReduce的介绍
- C++ Primer(第五版)练习3.36
- 在js中基本类型与引用类型的详解
- error LNK2019: 无法解析的外部符号 _GET_X_LPARAM,该符号在函数 _WndProc@16 中被引用
- ewrtert
- C++ Primer(第五版)练习3.40
- 进阶篇:同步阻塞队列之LinkedBlockingQueue(十一)
- 关于对象的数据属性