2017 Multi-University Training Contest 10 1008 Monkeys HDU 6178 (贪心 读入挂fread)
来源:互联网 发布:王大治知乎 编辑:程序博客网 时间:2024/06/05 03:10
题意:给你一棵n节点的树,现在让你放k个猴子,可以删边,问最少可以剩余几条边,放k个猴子,满足任意一个猴
子至少与一只猴子相连。2<=k<=n<=1e5
思路:我们可以知道一条边连两个节点(猴子),用成对的点这样是最节约边使猴子放的尽量多(一条边能放俩猴子)。现在问题就转化成就是要找可以有几个对点,可以从树根开始dfs,看他有几个儿子和儿子中已经成对的个
数,若两者之差>=1,则至少存在一个儿子能与它成对,cnt++。
虽然算法是On的,但是读入数据很多,所以需要用到fread读入挂。。
代码:
#include<iostream>#include<cstdio>#include<queue>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;const int maxn = 2e5+5;int n, m, k, can, head[maxn], use[maxn];struct node{ int v, next;}edge[maxn];namespace fastIO { #define BUF_SIZE 1000000 //fread -> read bool IOerror = 0; inline char nc() { static char buf[BUF_SIZE], *p1 = buf + BUF_SIZE, *pend = buf + BUF_SIZE; if(p1 == pend) { p1 = buf; pend = buf + fread(buf, 1, BUF_SIZE, stdin); if(pend == p1) { IOerror = 1; return -1; } } return *p1++; } inline bool blank(char ch) { return ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t'; } inline void read(int &x) { char ch; while(blank(ch = nc())); if(IOerror) return; for(x = ch - '0'; (ch = nc()) >= '0' && ch <= '9'; x = x * 10 + ch - '0'); } #undef BUF_SIZE};using namespace fastIO;void addEdge(int u, int v){ edge[k].v = v; edge[k].next = head[u]; head[u] = k++;}void dfs(int u, int fa){ int cnt = 0, uu = 0; for(int i = head[u]; i != -1; i = edge[i].next) { int v = edge[i].v; if(v == fa) continue; dfs(v, u); cnt++; uu += use[v]; } if(cnt-uu >= 1) can++, use[u] = 1;}int main(void){// freopen("in.txt", "r", stdin); int t; read(t); while(t--) { k = can = 0; memset(head, -1, sizeof(head)); memset(use, 0, sizeof(use)); read(n); read(m); for(int i = 2; i <= n; i++) { int tmp; read(tmp); addEdge(i, tmp); addEdge(tmp, i); } dfs(1, 0); if(can*2 >= m) printf("%d\n", (m+1)/2); else printf("%d\n", can+(m-can*2)); } return 0;}/*115 21 1 1 15 31 1 1 15 41 1 1 15 51 1 1 15 21 1 2 25 31 1 2 25 41 1 2 25 51 1 2 24 21 1 24 31 1 24 41 1 2*/
阅读全文
1 0
- 2017 Multi-University Training Contest 10 1008 Monkeys HDU 6178 (贪心 读入挂fread)
- 2017 Multi-University Training Contest 10 1008 Monkeys&& HDU 6178 (贪心+超级读入挂fread)
- 2017 Multi-University Training Contest 10 && HDU 6178 Monkeys 【贪心||树形DP】
- 2017 Multi-University Training Contest 10 1010 Schedule HDU 6180 (贪心)
- 2017 Multi-University Training Contest 10 1010 Schedule && HDU 6180 (贪心)
- HDU 3068 2017 Multi-University Training Contest
- HDU 6034 & 2017 Multi-University Training Contest
- hdu 6034 2017 Multi-University Training Contest
- HDU 3065 2017 Multi-University Training Contest
- HDU 6047 2017 Multi-University Training Contest
- HDU 6052 2017 Multi-University Training Contest
- HDU 6058 2017 Multi-University Training Contest
- HDU 6078 2017 Multi-University Training Contest
- hdu 6034 Balala Power!(贪心)( 2017 Multi-University Training Contest
- hdu 5802 Windows 10(2016 Multi-University Training Contest 6——贪心+dfs)
- (HDU 5802)2016 Multi-University Training Contest 6 Windows 10 (贪心)
- 2017 Multi-University Training Contest 1 1002. Balala Power!(贪心)
- 2017 Multi-University Training Contest
- Ajax 之windows7 安装IIS 启动web asp
- Linux网络IO模型
- 感知机学习总结
- spring boot用到的注解详解(二)
- 阿里云centos7安装docker笔记
- 2017 Multi-University Training Contest 10 1008 Monkeys HDU 6178 (贪心 读入挂fread)
- 【C#学习
- C语言-快速排序
- python实现-进制转换
- poj3320 Jessica's Reading Problem
- [模板]-二分图最大匹配
- Python PIP cannot find pywin32 (on windows)
- 为文中切换添加历史记录
- 【NDK Lab】CMAKE 创建新的C或C++原生库(基础篇)