比赛 20241128 评测结果 AAAAAAAAAA
题目名称 外卖 最终得分 100
用户昵称 ┭┮﹏┭┮ 运行时间 0.428 s
代码语言 C++ 内存使用 5.04 MiB
提交时间 2024-11-28 10:40:05
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ll long long
  4. #define pii pair<int,ll>
  5. #define fi first
  6. #define in inline
  7. #define se second
  8. #define mp make_pair
  9. #define pb push_back
  10. const int N = 510;
  11.  
  12. ll read(){
  13. ll x = 0,f = 1;char c = getchar();
  14. for(;c < '0' || c > '9';c = getchar())if(c == '-')f = -1;
  15. for(;c >= '0' && c <= '9';c = getchar())x = (x<<1) + (x<<3) + c-'0';
  16. return x * f;
  17. }
  18.  
  19. int n,m;
  20. int a[N];
  21. vector<int>e[N];
  22. ll f[N][N],g[N][N];
  23. void dfs(int x,int fa){
  24. for(int y : e[x]){
  25. if(y == fa)continue;
  26. dfs(y,x);
  27. }
  28. for(int i = 1;i <= m;i++)f[x][i] = g[x][i] = a[x];
  29. for(int y : e[x]){
  30. if(y == fa)continue;
  31. for(int i = m;i >= 0;i--){
  32. for(int j = 0;j <= i;j++){
  33. if(i - j - 1 >= 0)f[x][i] = max(f[x][i],g[x][i - j - 1] + max(f[y][j],g[y][j]));
  34. if(i - j - 2 >= 0)
  35. f[x][i] = max(f[x][i],f[x][i - j - 2] + g[y][j]),
  36. g[x][i] = max(g[x][i],g[x][i - j - 2] + g[y][j]);
  37. }
  38. }
  39. }
  40. }
  41.  
  42.  
  43. int main(){
  44. freopen("food.in","r",stdin);
  45. freopen("food.out","w",stdout);
  46. n = read(),m = read();
  47. for(int i = 1;i <= n;i++)a[i] = read();
  48. for(int i = 1;i < n;i++){
  49. int x = read(),y = read();
  50. e[x].pb(y),e[y].pb(x);
  51. }
  52. dfs(1,0);
  53. ll ans = 0;
  54. for(int i = 0;i <= m;i++)ans = max({ans,f[1][i],g[1][i]});
  55. printf("%lld\n",ans);
  56.  
  57. return 0;
  58.  
  59. }
  60.  
  61.  
  62.