描述
有 n 座城市,其中編號為 1 的是首都。
城市之間只能通過單向的傳送器進行移動。每座城市有且僅有乙個傳送器,第 i 個城市的傳送器指向城市 ai。保證從任意城市出發,經過若干次傳送,都能到達首都。
小a喜歡 k 這個數,他想讓你修改一些城市的傳送器,使得從每個城市出發,走恰好 k 步後都能恰好停在首都。
求最少需要修改多少個城市的傳送器。
輸入格式
第一行兩個數 n, k。
第二行 n 個數 a1~an,表示每個城市初始的傳送器指向的城市編號。
輸出格式
一行乙個數,表示最少需要修改多少個城市的傳送器。
樣例1
樣例輸入1
3 1
2 3 1
樣例輸出1
2樣例2
樣例輸入2
8 2
5 4 2 1 1 7 2 4
樣例輸出2
3仔細觀察你會發現,題目繞來繞去,就是給了你乙個樹形結構
不過這是乙個奇環內向樹
實際上是單個環
當然如果你足夠優秀,你會直接發現1必須連自己,然後你隨便給每個節點重新定父親,問最少需要給幾個節點重新定父親
實際上我們只要貪心的做就行了
很多人的做法是從上往下搜,把k+
1,2k
+1,3
k+1 k+1
,2k+
1,3k
+1
層全部改掉
實際上這樣是錯的,不是最優的
要從下往上搜
為什麼?
實際上抽象的想,從上往下相當於把從上往下選擇的層向上移若干層。
那移動之後的點數肯定比移動前的點數要少。
故從下往上搜肯定比從上往下搜更優
#include
using
namespace
std;
#define rep(i,j,k) for(int i = j;i <= k;++i)
#define repp(i,j,k) for(int i = j;i >= k;--i)
#define ll long long
int n , k;
int a[100100] , fa[100100] , hash[100100];
struct deepdep[100100];
vector
g[100100];
bool flag[100100];
int read()
while( c >= '0' && c <= '9' ) sum = sum * 10 + c - 48 , c = getchar();
if(flag) return sum;
else
return -sum;
} queue
q;void print1()
void change(int x)
q.pop();
}return;
}bool mycmp(deep a,deep b)
int solve1()
if(a[1] != 1) sum++;
return sum;
}void init()
if(k == 1) print1();
q.push(1);
while(q.size())
q.pop();
}rep(i,1,n) dep[i].id = i;
printf("%d\n",solve1());
return;
}int main()
二分貪心 T
題目 有1 1,2 2,3 3,4 4,5 5,6 6大小的盒子,要把它們裝到6 6的盒子裡,它們的高度都是相同的,用最少的6 6盒子把所有尺寸的盒子都裝起來。解題思路 6 6,5 5以及4 4尺寸的物品每個物品需要占有乙個箱子,3 3的物品乙個箱子可以放4個,2 2的物品箱子可以放9個,1 1的可...
D班集訓day1t2 道路分組(貪心)
比較簡單的一道題。因為分組必須連續,故可以直接貪心。能加則加,不能加則不加,更新可以用類似於增廣的思想去做 include using namespace std define rep i,j,k for int i j i k i define repp i,j,k for int i j i k...
演算法 貪心(1)
今天實驗做的是貪心演算法,中午睡醒然後爬了九樓去實驗室,討厭,老師沒有提前發實驗指導書剛開始還是討厭的,因為以前都是提前做好直接過來驗收的,畢竟對自己還是很沒有信心能夠在實驗課上完成實驗的 哎,事實證明確實沒有完成,思路想法都是有的,就是不會用高階語言實現了,難受難受 說正事吧,貪心演算法,就是目光...