【貪心法】奇數陣列 思路解析和程式碼
奇數陣列
輸入正整數n和長度為n(? ≤ 105)的數列??(1 ≤ a? ≤ 109)。在一次操作中你可以選擇一個偶數c,並且把所有等於c的數除以2。例如a = [6,8,12,6,3,12],選擇c = 6進行一次操作後a = [3,8,12,3,3,12]。請問最少進行多少次操作後, ?? 的所有數都變成奇數。請嘗試設計演算法進行計算。
樣例輸入
6
40 6 40 3 20 1
樣例輸出
4
個人思路
思路
本題應該採用貪心策略,每次選擇陣列中最大的偶數作為運算元,然後遍歷整個陣列並對與運算元相等的數進行除2操作,直到陣列中全部為奇數為止
貪心策略證明:設當前有四個偶數並滿足a > b > c > d。根據貪心策略,第一次取運算元為a,得到陣列[a/2,b,c,d]:
- if(a/2 > b),第二次運算元為a/2,得到的陣列為[a/4,b,c,d]
- else if(a/2 == b),第二次運算元為a/2,得到的陣列為[a/4,b/2,c,d]
- else(即a/2 < b),第二次運算元為b,得到的陣列為[a/2,b/2,c,d]
顯然取最大的數字作為運算元時,有可能同時對兩個及以上個數的元素進行除2操作,因此是最優選擇
注意
- 使用雙端佇列deque,便於在初始化時對陣列進行排序操作
- deque中只儲存偶數元素
- 操作過程中,如果出現偶數直接刪去
- 每次對deque遍歷後,要對序列進行排序,由於此時序列基本有序,因此採用插排更有效率
個人思路程式碼
/*
* @Author: LLX
* @Date: 2020-10-31 19:19:03
* @Last Modified by: SEUer
* @Last Modified time: 2020-10-31 21:03:58
*/
//記錄偶數,記錄最大的數字
#include<bits/stdc++.h>
using namespace std;
deque<int> arr;
int n, ans;
void insertSort(){//對於基本有序的陣列,插排效率更高
int index = 0;
for(int i = 1; i < n; ++i){
if(arr[index] < arr[i]){
swap(arr[index], arr[i]);
index = i;
}else{
break;
}
}
}
void display(){
for(int i = 0; i < arr.size(); ++i){
cout << arr[i] << " ";
}
cout << endl;
}
int main(){
int firstnum;
scanf("%d%d", &n, &firstnum);
arr.push_back(firstnum);
for(int i = 1; i < n; ++i){
int num;
scanf("%d", &num);
if(num % 2 == 0){//arr中只存在偶數
if(num > arr[0])
arr.push_front(num);
else
arr.push_back(num);
}
}
display();
while(arr.size() > 0){
int c = arr[0];//取整個陣列當前最大偶數
ans++;
cout << "******第" << ans << "次*******" << endl;
for(auto j = arr.begin(); j != arr.end(); ++j){
if(arr.size() == 0){
break;
}
if(*j == c)
*j /= 2;
if(*j % 2 == 1)//除2之後為奇數,則出隊
arr.erase(j);
insertSort();
display();
}
}
cout << ans << endl;
system("pause");
return 0;
}
/*
4
56 16 24 40
*/
相關文章
- 【LeetCode】【分治法】連續數列(最大子序和)思路解析和程式碼LeetCode
- 貪心法
- 1588 所有奇數長度子陣列的和(字首和)陣列
- 【力扣】最大子陣列和(貪心)力扣陣列
- 【陣列】1550. 存在連續三個奇數的陣列(簡單)陣列
- 貪心法-Best Time to Buy and Sell Stock
- PAT-B 1020 月餅【貪心法】
- Vue原始碼解析之陣列變異Vue原始碼陣列
- 陣列[簡單]1550. 存在連續三個奇數的陣列2020/11/14(6)陣列
- KMP演算法以及優化(程式碼分析以及求解next陣列和nextval陣列)KMP演算法優化陣列
- JavaScript陣列常用方法解析和深層次js陣列扁平化JavaScript陣列JS
- C語言 二維陣列實現三子棋的思路及程式碼C語言陣列
- 解析arrify 轉陣列實現示例原始碼陣列原始碼
- Java break、continue 詳解與陣列深入解析:單維陣列和多維陣列詳細教程Java陣列
- Js陣列方法解析JS陣列
- 解析樹狀陣列陣列
- lLeeCode最優題解收錄:1588.所有奇數長度子陣列的和陣列
- 劍指Offer:JZ30-連續子陣列最大和(解題思路+Java程式碼)陣列Java
- c語言 將一個陣列中的奇數和偶數分開放在一起C語言陣列
- 二維陣列程式碼案例分析陣列
- 【劍指Offer】調整陣列順序使奇數位於偶數前面陣列
- JZ-013-調整陣列順序使奇數位於偶數前面陣列
- 面試題21:調整陣列順序奇數位於偶數前面面試題陣列
- G64【模板】線性基 貪心法 P3812 最大異或和
- 矩陣和陣列矩陣陣列
- LeetCode題解(1550):陣列中存在連續三個奇數(Python)LeetCode陣列Python
- Javascript - 陣列和陣列的方法JavaScript陣列
- 魔功心法-列舉篇
- 求陣列內所有偶數的和陣列
- 【C語言】調整陣列使奇數全部都位於偶數前面。C語言陣列
- JavaScript陣列合並程式碼例項JavaScript陣列
- 【程式碼隨想錄】一、陣列:5.螺旋矩陣陣列矩陣
- python實現給定一個數和陣列,求陣列中兩數之和為給定的數Python陣列
- 指標陣列和陣列指標與二維陣列指標陣列
- 1到100迴圈,並把奇數放到陣列中,把偶數放到map中陣列
- 劍指 Offer 21. 調整陣列順序使奇數位於偶數前面陣列
- JS常用陣列操作全解析JS陣列
- C#中如何獲取二維陣列的行數和列數?C#陣列