問題の説明
配列Aにはn個の要素があり、初期値は0です。配列に対して次の2つの操作を実行できます:1.配列の要素に1を追加する; 2.配列のすべての要素に2を乗算する。配列Aを初期状態からターゲット状態Bに変更するために必要なオペランドの最小数を見つけます。
入力フォーマット
nは正の整数の最初の行は、アレイ内の要素の数を表し
の第2行のN個の目標状態の正の整数Bの要素を表します
の第2行のN個の目標状態の正の整数Bの要素を表します
出力フォーマット
出力ラインは操作の最小数を表します
入力例
2
7 8
7 8
出力例
7
データサイズと合意
n <= 50、B [i] <= 1000
この質問はとても楽しいです。
正の解決策は、B配列をすべて0の配列に変更するには、少なくとも数ステップはかかると考えることです。
私はしばらくの間(1)に対して非常に抵抗力がありましたが、今では非常に便利な場合があります。
https://www.cnblogs.com/lusiqi/p/12547532.htmlからの参照
1 #include <bits / stdc ++。h> 2 名前空間std を使用 。 3 int a [ 60 ]; 4 int main(){ 5 int n; 6 cin >> n; 7 for(int i = 1 ; i <= n; i ++ ){ 8 cin >> a [i]; 9 } 10 int ans = 0 ; 11 while(1 ){ 12 for(int i = 1 ; i <= n; i ++ ){ 13 if(a [i]%2 == 1 ){ 14 ans ++ ; 15 a [i]- ; 16 } 17 } 18 int cnt = 0 ; 19 for(int i = 1 ; i <= n; i ++ ){ 20 if(a [i] == 0 ){ 21 cnt ++ ; 22 } 23 } 24 if(cnt == n){ 25 休憩; 26 } 27 for(int i = 1 ; i <= n; i ++ ){ 28 a [i] / = 2 ; 29 30 } 31 ans ++ ; 32 } 33 cout << ans << endl; 34は 0を返し ます。 35 }