JZOJ 4625. 【NOIP2016提高A组模拟7.15】树

数据范围很小也许是装压……但并不知道怎么装压……

有一个有趣的骗分方法:将度数从大到小排序,每次取度数最大的并连边,加上特判无解的情况一共有40pts

题解是这样的:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 25;
 4 
 5 queue<pair<int, int> > q;
 6 int n, a[N], cnt;
 7 vector<int> G[N];
 8 int mx[N], ans[N];
 9 
10 namespace xuanxuepianfen {
11     void dfs(int u) {
12     //    cout << u << "{";
13         ans[u] = mx[u] = 0;
14         for(int i = 0 ; i < G[u].size() ; ++ i) {
15             int v = G[u][i];
16             dfs(v);
17             ans[u] = max(ans[u], max(ans[v], mx[u] + mx[v] + 1));
18             mx[u] = max(mx[u], mx[v] + 1);
19             
20         }
21         ans[u] = max(ans[u], mx[u]);
22     //    cout << "}";
23     }
24     void sol() {
25         sort(a + 1, a + 1 + n, greater<int>());
26         for(int i = 1 ; i <= n ; ++ i) {
27             ++ cnt;
28             if(q.empty()) {
29                 q.push(make_pair(cnt, a[i]));
30             } else {
31                 while(q.front().second == 0) q.pop();
32                 q.front().second --;
33                 G[q.front().first].push_back(cnt);
34                 q.push(make_pair(cnt, a[i] - 1));
35             }
36         }
37         dfs(1);
38         printf("%d\n", ans[1]);
39     }
40 }
41 int main() {
42     scanf("%d", &n);
43     int sum = 0;
44     for(int i = 1 ; i <= n ; ++ i) scanf("%d", &a[i]), sum += a[i];
45     if(sum != 2 * (n - 1)) return puts("-1"), 0;
46     int ans = n - 1;
47     for(int i = 1 ; i <= n ; ++ i) ans -= max(2, a[i]) - 2;
48     printf("%d\n", ans);
49 }
View Code

 

转载于:https://www.cnblogs.com/KingSann/articles/9428985.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值