成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

每日一練c++題目日刊|第七期-創(chuàng)新互聯(lián)

文章目錄
  • 第一題:最小的 k 個(gè)數(shù)
    • 題目描述
    • 輸入格式
    • 輸出格式
    • 輸入樣例
    • 輸出樣例
    • 解題思路&C++題解
      • 算法
  • 第二題:智慧之海
    • 故事背景
    • 題目描述
    • 輸入格式
    • 輸出格式
    • 輸入樣例
    • 輸出樣例
    • 解題思路&C++題解

網(wǎng)站設(shè)計(jì)制作過程拒絕使用模板建站;使用PHP+MYSQL原生開發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺管理系統(tǒng);成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作收費(fèi)合理;免費(fèi)進(jìn)行網(wǎng)站備案等企業(yè)網(wǎng)站建設(shè)一條龍服務(wù).我們是一家持續(xù)穩(wěn)定運(yùn)營了10年的創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司。第一題:最小的 k 個(gè)數(shù) 題目描述

有一個(gè)長度為 n 的由 0 和 1 組成的字符串 s,你需要用最少的步數(shù)將其變成只包含 0 的字符串。在每一步中,你可以選擇任意一個(gè)子串,并將其中所有 1 都反轉(zhuǎn)為 0。你需要輸出最少的步數(shù)。

例如,對于字符串 s = “110101”,你可以進(jìn)行如下步驟:

第一步:反轉(zhuǎn)從第 1 個(gè)字符到第 3 個(gè)字符的子串 “110”,得到字符串 “000101”。
第二步:反轉(zhuǎn)從第 1 個(gè)字符到第 6 個(gè)字符的子串 “000101”,得到字符串 “000000”。
因此,最少的步數(shù)為 2。

輸入格式

輸入的第一行包含一個(gè)字符串 s,長度不超過 1 0 5 10^5 105。

輸出格式

輸出一個(gè)整數(shù),表示最少的步數(shù)。

輸入樣例
110101
輸出樣例
2
解題思路&C++題解

請?jiān)谙旅婢帉懩愕?C++ 代碼來解決這道題目:

#include#includeusing namespace std;

int main() {// 讀入字符串 s
  string s;
  cin >>s;

  // 計(jì)算最少的步數(shù)
  int steps = 0;
  // 在此處編寫你的代碼

  // 輸出結(jié)果
  cout<< steps<< endl;

  return 0;
}
算法

這道題目的算法設(shè)計(jì)是使用前綴和數(shù)組來計(jì)算最少的步數(shù)。

首先,我們從前往后遍歷字符串 s,并計(jì)算出前綴和數(shù)組 prefix。前綴和數(shù)組的定義是,對于字符串 s,前綴和數(shù)組為 a,則 a[i] 表示 s[1] 到 s[i] 中 1 的數(shù)量。

然后,對于每一個(gè)字符,我們進(jìn)行如下操作:

如果當(dāng)前字符是 1,則將步數(shù)加 1。
否則,枚舉以當(dāng)前字符為起點(diǎn)的子串,并計(jì)算出它中 1 的數(shù)量。然后用這個(gè)數(shù)量來更新答案。
這樣的時(shí)間復(fù)雜度是 O ( n 2 ) O(n^2) O(n2),因?yàn)槲覀儗τ诿恳粋€(gè)字符都枚舉了它的子串。

但是,我們可以使用前綴和數(shù)組來優(yōu)化這個(gè)算法。使用前綴和數(shù)組,我們可以在 O ( 1 ) O(1) O(1)的時(shí)間內(nèi)計(jì)算出任意一個(gè)子串中 1 的數(shù)量。因此,我們可以將時(shí)間復(fù)雜度優(yōu)化到 O ( n ) O(n) O(n)。

下面是 c++ 代碼實(shí)現(xiàn):

#include#includeusing namespace std;

int main() {// 讀入字符串 s
  string s;
  cin >>s;
  int n = s.size();

  // 計(jì)算前綴和數(shù)組
  int prefix[n + 1];
  prefix[0] = 0;
  for (int i = 1; i<= n; i++) {prefix[i] = prefix[i - 1] + (s[i - 1] == '1');
  }

  // 計(jì)算最少的步數(shù)
  int steps = 0;
  for (int i = 0; i< n; i++) {// 如果當(dāng)前字符是 1,則將步數(shù)加 1
    if (s[i] == '1') {  steps++;
    }
    // 否則,枚舉以當(dāng)前字符為起點(diǎn)的子串
    else {  for (int j = i + 1; j<= n; j++) {// 計(jì)算子串中 1 的數(shù)量
        int ones = prefix[j] - prefix[i];
        // 更新答案
        steps = min(steps, ones);
      }
    }
  }

  // 輸出結(jié)果
  cout<< steps<< endl;

  return 0;
}

上面的代碼實(shí)現(xiàn)了狀態(tài)轉(zhuǎn)移方程的過程。

注意:

  • 矩陣的行和列都是從 1 開始編號的,所以要注意初始化和轉(zhuǎn)移的時(shí)候數(shù)組下標(biāo)的邊界。

  • 在轉(zhuǎn)移的時(shí)候,需要考慮使用道具的情況。

第二題:智慧之海 故事背景

海神波塞冬擁有著神奇的能力,他能夠?qū)⒁粋€(gè)人的智慧轉(zhuǎn)化成數(shù)字,并將這個(gè)數(shù)字存儲在一個(gè)無序數(shù)組中。但是,有一天,海神波塞冬收到了一個(gè)神秘的任務(wù),要求他從這個(gè)無序數(shù)組中找出最小的 k 個(gè)數(shù),并將它們存儲在另一個(gè)數(shù)組中。

題目描述

給定一個(gè)無序數(shù)組 a 和整數(shù) k,你需要在 a 中找出最小的 k 個(gè)數(shù),并將它們存儲在另一個(gè)數(shù)組 b 中。

例如,對于數(shù)組 [3, 4, 1, 2, 5] 和 k = 3,你可以進(jìn)行如下操作:

第一步:找出數(shù)組中最小的數(shù)字 1,將其存儲在另一個(gè)數(shù)組 b 中。
第二步:找出數(shù)組中第二小的數(shù)字 2,將其存儲在另一個(gè)數(shù)組 b 中。
第三步:找出數(shù)組中第三小的數(shù)字 3,將其存儲在另一個(gè)數(shù)組 b 中。
因此,最后得到的另一個(gè)數(shù)組 b 為 [1, 2, 3]。

請?jiān)谙旅婢帉懩愕?C++ 代碼來解決這道題目:

#include#include 

using namespace std;

int main() {// 讀入數(shù)組 a 和 k
  int a[10], k;
  for (int i = 0; i< 10; i++) {cin >>a[i];
  }
  cin >>k;

  // 計(jì)算最小的 k 個(gè)數(shù)并存儲在另一個(gè)數(shù)組 b 中
  int b[k];
  // 在此處編寫你的代碼

  // 輸出結(jié)果
  for (int i = 0; i< k; i++) {cout<< b[i]<< " ";
  }
  cout<< endl;

  return 0;
}

請注意,你的算法的時(shí)間復(fù)雜度應(yīng)該盡可能低。

輸入格式

第一行包含整數(shù) n,表示數(shù)組 a 的長度。

第二行包含 n 個(gè)整數(shù),依次為數(shù)組 a 的元素。

第三行包含整數(shù) k。

輸出格式

輸出一行,包含 k 個(gè)整數(shù),依次為數(shù)組 b 中的元素。

輸入樣例
5
3 4 1 2 5
3
輸出樣例
1 2 3
解題思路&C++題解

這道題的題意是,給定一個(gè)無序數(shù)組 a 和整數(shù) k,你需要在 a 中找出最小的 k 個(gè)數(shù),并將它們存儲在另一個(gè)數(shù)組 b 中。

解題思路:

一種方法是使用排序算法將數(shù)組 a 排序,然后直接取前 k 個(gè)數(shù)即可。時(shí)間復(fù)雜度為 O ( n l o g n ) O(nlogn) O(nlogn)。

另一種方法是使用堆來解決這道題。我們可以將數(shù)組 a 中的數(shù)字插入到一個(gè)大根堆中,然后每次取出堆頂元素,將其存儲在數(shù)組 b 中。這樣,當(dāng)我們?nèi)〕隽?k 個(gè)數(shù)字之后,堆中剩余的數(shù)字就是最小的 k 個(gè)數(shù)字。因此,我們可以在每次插入元素之前檢查堆的大小,如果堆的大小超過 k,就將堆頂元素彈出。

這種方法的時(shí)間復(fù)雜度為 O ( n l o g k ) O(nlogk) O(nlogk),要比前一種方法更優(yōu)。

下面是使用堆來解決這道題的 C++ 代碼:

#include#include 
#includeusing namespace std;

int main() {// 讀入數(shù)組 a 和 k
  int n, k;
  cin >>n;
  int a[n];
  for (int i = 0; i< n; i++) {cin >>a[i];
  }
  cin >>k;

  // 計(jì)算最小的 k 個(gè)數(shù)并存儲在另一個(gè)數(shù)組 b 中
  int b[k];
  priority_queue, greater>q;
  for (int i = 0; i< n; i++) {q.push(a[i]);
    if (q.size() >k) {  q.pop();
    }
  }
  for (int i = k - 1; i >= 0; i--) {b[i] = q.top();
    q.pop();
  }

  // 輸出結(jié)果
  for (int i = 0; i< k; i++) {cout<< b[i]<< " ";
  }
  cout<< endl;

  return 0;
}

這就是使用堆來解決本題的解法。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

當(dāng)前標(biāo)題:每日一練c++題目日刊|第七期-創(chuàng)新互聯(lián)
文章出自:http://jinyejixie.com/article24/djsgce.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、虛擬主機(jī)、響應(yīng)式網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、手機(jī)網(wǎng)站建設(shè)、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
原阳县| 永仁县| 奉节县| 武汉市| 个旧市| 南充市| 社旗县| 常熟市| 呼图壁县| 满城县| 从江县| 那坡县| 新建县| 扎赉特旗| 大荔县| 福安市| 长武县| 桦南县| 蓬安县| 呼图壁县| 荥阳市| 宁晋县| 太康县| 象州县| 碌曲县| 玉龙| 无锡市| 德安县| 景德镇市| 堆龙德庆县| 澳门| 台山市| 房产| 河西区| 天镇县| 黄龙县| 博罗县| 镇赉县| 手游| 个旧市| 九江县|