Week 10 拿數問題II

2021-10-05 12:51:00 字數 1614 閱讀 3368

yjq 上完第10周的程式設計思維與實踐後,想到乙個絕妙的主意,他對拿數問題做了一點小修改,使得這道題變成了 拿數問題 ii。

給乙個序列,裡邊有 n 個數,每一步能拿走乙個數,比如拿第 i 個數, ai = x,得到相應的分數 x,但拿掉這個 ai 後,x+1 和 x-1 (如果有 aj = x+1 或 aj = x-1 存在) 就會變得不可拿(但是有 aj = x 的話可以繼續拿這個 x)。求最大分數。

input

第一行包含乙個整數 n (1 ≤ n ≤ 105),表示數字裡的元素的個數

第二行包含n個整數a1, a2, ..., an (1 ≤ ai ≤ 105)

output

輸出乙個整數:n你能得到最大分值。
樣例輸入1

2

1 2

樣例輸出1

2
樣例輸入2

3

1 2 3

樣例輸出2

4
樣例輸入3

9

1 2 1 3 2 2 2 2 3

樣例輸出3

10
本題是按照數值的大小,選或者不選,例如,選擇了序列中的5,那麼序列中的4和6就都不能選擇,其中序列中的所有的5全部被選擇,此時temp[i]表示從minn到i選數獲得的最大分數,sum[i]陣列表示序列中數i出現的次數

首先對陣列中的最大值和最小值進行記錄,記為minn和maxx,對於minn到maxx之間的數進行遍歷,如果i-1已選,那麼i就不可選擇;如果i-1未被選,在i-2的基礎上,選擇i,temp[i]=max(temp[i],temp[i-2]+i*sum[i]),直到遍歷完成。

輸出temp中的最大值即可

需要注意ai和n的資料範圍都是1e5,那麼就要注意,最後的結果可能會超過int的範圍,要使用long long

#include

#include

#include

using

namespace std;

long

long a[

100010

],sum[

100010];

long

long minn=

100010

,maxx=0;

long

long temp[

100010];

long

long ans=0;

intmain()

for(

long

long i=minn;i<=maxx;i++

)for

(long

long i=minn;i<=maxx;i++)

cout<}

week10 作業C 拿數問題II

給 n 個數,每一步能拿走乙個數,比如拿第 i 個數,ai x,得到相應的分數 x,但拿掉這個 ai 後,x 1 和 x 1 如果有 aj x 1 或 aj x 1 存在 就會變得不可拿 但是有 aj x 的話可以繼續拿這個 x 求最大分數。本題和課上講的有些許不一樣,但是核心是一樣,需要你自己思考...

Week10 作業 C 拿數問題 II

一 題目描述 題面 給 n 個數,每一步能拿走乙個數,比如拿第 i 個數,ai x,得到相應的分數 x,但拿掉這個 ai 後,x 1 和 x 1 如果有 aj x 1 或 aj x 1 存在 就會變得不可拿 但是有 aj x 的話可以繼續拿這個 x 求最大分數。本題和課上講的有些許不一樣,但是核心是...

Week10 作業C 拿數問題 II

yjq 上完第10周的程式設計思維與實踐後,想到乙個絕妙的主意,他對拿數問題做了一點小修改,使得這道題變成了 拿數問題 ii。給乙個序列,裡邊有 n 個數,每一步能拿走乙個數,比如拿第 i 個數,ai x,得到相應的分數 x,但拿掉這個 ai 後,x 1 和 x 1 如果有 aj x 1 或 aj ...