第十周作業 C

2021-10-05 12:00:33 字數 1750 閱讀 4475

題目描述:

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...