我只做出来了第一道和第三道,我把第三道贴出来吧 思路就是:生成一个最小生成树,找出最深的节点。从根到最深都是花费1,其他的节点都是一步花费2。 #include<bits/stdc++.h> using namespace std; int a[1001] = {0}; int main(){ memset(a, -1, 1000); int n, k; cin >> n >> k; int tmp; for(int i = 0; i < n-1;i++){ cin >> tmp; if(tmp > i+1){ a[tmp] = i+1; }else{ a[i+1] = tmp; } } int b[1001] = {0}; for(int i = n-1; i >= 0 ;i--){ b[a[i]] = b[a[i]] > (b[i]+1) ? b[a[i]] : (b[i]+1); } for(int i = 0; i < n ;i++){ cout << b[i] << " "; } if(k <= b[0]){ cout << b[0] + 1; }else{ cout << (k - b[0])/2 + b[0] + 1; } return 0; }