題目描述:
yjq 上完第10周的程式設計思維與實踐後,想到乙個絕妙的主意,他對拿數問題做了一點小修改,使得這道題變成了 拿數問題 ii。
給乙個序列,裡邊有 n 個數,每一步能拿走乙個數,比如拿第 i 個數, ai = x,得到相應的分數 x,但拿掉這個 ai 後,x+1 和 x-1 (如果有 aj = x+1 或 aj = x-1 存在) 就會變得不可拿(但是有 aj = x 的話可以繼續拿這個 x)。求最大分數。
本題和課上講的有些許不一樣,但是核心是一樣,需要你自己思考。
輸入:第一行包含乙個整數 n (1 ≤ n ≤ 105),表示數字裡的元素的個數
第二行包含n個整數a1, a2, …, an (1 ≤ ai ≤ 105)
輸出:輸出乙個整數:n你能得到最大分值。
sample:
input
21 2
output
2input
31 2 3
output
4input
91 2 1 3 2 2 2 2 3
output
10note:
對於第三個樣例:先選任何乙個值為2的元素,最後陣列內剩下4個2。然後4次選擇2,最終得到10分。
題目分析:
首先他的要求是與數的大小有關,所以我們最好的辦法就是排序,讓它變得有序,這樣的話就好處理了,對於寫for迴圈取數就方便了。
sort
(a+1
,a+n+1)
;
然後就是怎麼取了,這裡面會出現很多重複的數,而且重複的數沒有限制,也就是既然要最大那就要在拿的時候一次拿完,在最後計算結果的時候也好計算,乙個數*出現的次數就能求出對應的值,這樣我們就需要用另外乙個陣列記錄下每個數字出現的頻率。此外還有乙個好處,就是這裡面的數可能是不連續的,但是遍歷的時候是連續遍歷的,所以如果for裡面取值取了乙個數列裡面沒有出現的值,那麼就可以直接按0處理,0乘任何數都是0,不影響結果。
for
(int i=
1;i<=n;i++
)
那麼之後就可以遍歷計算了,計算的方法就是這一次要取的和上一次取了的+這個數出現的次數*這個數(也就是一次取出所有的這個數,那這樣就是最大的)進行比較,取最大值,然後在計算這裡面最大值的最大值就能求出答案了。
for
(long
long i=a[1]
;i<=a[n]
;i++
)
順便一提,這裡面的最後資料要開ll,否則會爆掉,但是用max比較的時候要相同資料型別,所以所有的都要用ll。
**如下:
#include
#include
using
namespace std;
long
long a[
100010];
long
long count1[
100010]=
;long
long score[
100010]=
;int
main()
sort
(a+1
,a+n+1)
;long
long ans=
-114514
;for
(long
long i=a[1]
;i<=a[n]
;i++
) cout<}
第十周作業
1.感觸太多!讓我醍醐灌頂 2.很有教育意義 3.看您的文章真的是享受。觀察問題和思考原因,最後給出解決辦法!每每一針見血。1.公司員工要想長久要給員工提供提公升空間,讓員工替老闆幹,轉變為員工為自己幹。2.學習能力尤為重要,我們要不斷學習提公升自身能力 3.給出清晰 明確的目標,知道自己該幹嘛,知...
第十周作業
本次作業所屬課程 c語言程式設計 本次作業要求 我在這個課程的目標是 學會熟練使用結構型別 本次學習在哪些具體方面幫組我實現目標 自己定義結構還是會方便很多 參考文獻 c primer plus第六版 一 劉未鵬的部落格 怎樣花兩年時間面試乙個人 a 實踐是檢驗真理的唯一標準!能說會道的前提是你要有...
第十周作業
十一周上機作業 cola公司的雇員分為以下若干類 知識點 多型 1 colaemployee 這是所有員工總的父類,屬性 員工的姓名,員工的生日月份。方法 getsalary int month 根據引數月份來確定工資,如果該月員工過生日,則公司會額外獎勵100 元。2 salariedemploy...