演算法分析:計數排序
複雜度:θ(k+n)
題目
題目描述解答(c++)明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了 nnn 個 111 到 100010001000 之間的隨機整數(n≤100n≤100n≤100),對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不同的學生的學號。然後再把這些數從小到大排序,按照排好的順序去找同學做調查。請你協助明明完成「去重」與「排序」的工作
**輸入描述 **
有 2 行,第 1 行為 1 個正整數 nnn,表示所生成的隨機數的個數:
第 2行有 n個用空格隔開的正整數,為所產生的隨機數。
輸出描述
有2行,第 1 行為 1 個正整數 m,表示不相同的隨機數的個數。第 2 行為 mmm 個用空格隔開的正整數,為從小到大排好序的不相同的隨機數。
//明明的隨機數
#include
using
namespace std;
intmain()
}cout
0;i<
1000
;i++)if
(x[i]==1
) cout<1<<
' ';
return0;
}
分析:快速排序
題目
題目描述解答(c++)某小學最近得到了一筆贊助,打算拿出其中一部分為學習成績優秀的前 555 名學生發獎學金。期末,每個學生都有3門課的成績:語文、數學、英語。先按總分從高到低排序,如果兩個同學總分相同,再按語文成績從高到低排序,如果兩個同學總分和語文成績都相同,那麼規定學號小的同學 排在前面,這樣,每個學生的排序是唯一確定的。任務:先根據輸入的 3 門課的成績計算總分,然後按上述規則排序,最後按排名順序輸出前五名名學生的學號和總分。注意,在前 5 名同學中,每個人的獎學金都不相同,因此,你必須嚴格按上述規則排序。例如,在某個正確答案中,如果前兩行的輸出資料(每行輸出兩個數:學號、總分) 是:
7 279
5 279
這兩行資料的含義是:總分最高的兩個同學的學號依次是 7 號、5 號。這兩名同學的總分都是 279(總分等於輸入的語文、數學、英語三科成績之和),但學號為 7 的學生語文成績更高一些。如果你的前兩名的輸出資料是:
5 279
7 279
則按輸出錯誤處理,不能得分。
輸入描述
第 1 行為乙個正整數 n,表示該校參加評選的學生人數。第 2 到 n+1 行,每行有 3個用空格隔開的數字,每個數字都在 0 到 100 之間。第 j 行的 3個數字依次表示學號為 j-1 的學生的語文、數學、英語的成績。每個學生的學號按照輸入順序編號為 1 ~ n (恰好是輸入資料的行號減 1)。所給的資料都是正確的,不必檢驗。
輸出描述
共有 5 行,每行是兩個用空格隔開的正整數,依次表示前 5 名學生的學號和總分。
//獎學金
#include
using
namespace std;
struct score
;//存學生資訊
intpartition
(score *x,
int l,
int r)
//確定乙個元素的特定位置
}score t=x[
++ret]
;x[ret]
=x[r]
;x[r]
=t;return ret;
}void
quick_sort
(score *x,
int l,
int r)
//快速排序
}int
main()
//輸入
quick_sort
(x,0
,n-1);
//快速排序
for(i=
0;i<
5;i++
)//輸出
cout<.id<<
' '<.sum
}`
分析:排序、貪心演算法
題目
題目描述解答(c++)元旦快到了,校學生會讓樂樂負責新年晚會的紀念品發放工作。為使得參加晚會的同學所獲得 的紀念品價值相對均衡,他要把購來的紀念品根據**進行分組,但每組最多只能包括兩件紀念品, 並且每組紀念品的**之和不能超過乙個給定的整數。為了保證在盡量短的時間內發完所有紀念品,樂樂希望分組的數目最少。你的任務是寫乙個程式,找出所有分組方案中分組數最少的一種,輸出最少的分組數目。
輸入描述
第 1 行包括乙個整數 w,為每組紀念品**之和的上眼第 2 行為乙個整數 n,表示購來的紀念品的總件數第 3 ~ n+2 行每行包含乙個正整數 pi(5≤pi≤w) 表示所對應紀念品的**。
輸出描述
僅一行,包含乙個整數, 即最少的分組數目。
//紀念品分組
#include
using
namespace std;
intpartition
(int
*x,int l,
int r)
int t=x[
++ret]
; x[ret]
=x[r]
; x[r]
=t;return ret;
}void
quick_sort
(int
*x,int l,
int r)
}int
find_max_group
(int
*x,int n,
int max)
else
j--;}
return n-ret;
}int
main()
分析:排序(為裝逼採用堆排序)、揹包演算法
題目
題目描述原始碼(c++)牛奶包裝是乙個如此低利潤的生意,以至於盡可能低地控制初級產品(牛奶)的**變得十分重要。請幫助merry的牛奶製造公司(merry milk makers』)以盡可能最廉價的方式取得他們所需的牛奶。merry的牛奶製造公司從一些農民那購買牛奶,每個農民賣給牛奶製造公司的**不一定相同。而且,如乙隻母牛一天只能生產一定量的牛奶,農民每一天只有一定量的牛奶可以賣。每天,merry 的牛奶製造公司從每個農民那購買一定量的牛奶,少於或等於農民所能提供的最大值。給出 merry 牛奶製造公司的每日的牛奶需求,連同每個農民的可提供的牛奶量和每加侖的**,請計算 merry 的牛奶製造公司所要付出錢的最小值。注意:每天農民生產的牛奶的總數對 merry 的牛奶製造公司來說是足夠的。
輸入描述
第 1 行共二個數值:n,(0≤n≤2,000,000) 是需要牛奶的總數;m,(0≤m≤5,000) 是提供牛奶的農民個數。第 2 到 m+1 行:每行二個整數:pi 和 ai。pi(0≤pi≤1,000) 是農民 i 的牛奶的**。ai(0≤ai≤2,000,000) 是農民 i 一天能賣給 marry 的牛奶製造公司的牛奶數量。
輸出描述
單獨的一行包含單獨的乙個整數,表示 marry 的牛奶製造公司拿到所需的牛奶所要的最小費用。
#include
using
namespace std;
struct milk
;void
exchange
(milk &x,milk &y)
void
max_heap
(milk *x,
int i,
int n)
}void
build_max_heap
(milk *x,
int n)
void
heap_sort
(milk *x,
int n)
}int
main()
if(provide<=demand)
cout
return0;
}
分析:找準迴圈不變數
題目
題目描述原始碼(c++)設有 n 個正整數(n≤20),將它們聯接成一排,組成乙個最大的多位整數。
例如:n=3 時,3 個整數 13,312,343 聯接成的最大整數為:34331213
又如:n=4 時,4 個整數 7,13,4,246 聯接成的最大整數為:7424613
輸入描述
n個數輸出描述
聯接成的多位數
#include
using
namespace std;
intcompare_int
(int x,
int y)
void
bubble_sort
(int
*x,int n)
}int
main()
C LeetCode刷題 排序
排序篇 題名刷題通過率難度 56合併區間 31.2 中等57 插入區間 30.4 困難75 顏色分類 48.6 中等147 對鍊錶進行插入排序 50.7 中等148 排序鍊錶 52.7 中等164 最大間距 43.0 困難179 最大數 26.7 中等242 有效的字母異位詞 c leetcode刷...
刷題模板 排序
public void quicksort int input,int p,int q public int partition int input,int p,int q swap input,i,j 必須 input p input i input i temp 必須 return i 參考 用...
刷題筆記 排序
1.確定分界點 mid l r 2 2.遞迴排序left right部分 3.使用雙指標演算法歸併排序left right部分 1.總的數量等於 left邊中逆序對的數量 right邊中逆序對的數量 left right兩邊的元素共同組成的逆序對的數量 2.如何求算left right兩邊的元素共同...