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),表示數字裡的元素的個數output第二行包含n個整數a1, a2, …, an (1 ≤ ai ≤ 105)
輸出乙個整數:n你能得到最大分值。example
inputhint21 2
output
2input
31 2 3
output
4input
91 2 1 3 2 2 2 2 3
output
10
對於第三個樣例:先選任何乙個值為2的元素,最後陣列內剩下4個2。然後4次選擇2,最終得到10分。這個與課上的題類似,只不過要進一步處理一下,課本上是ai-1,ai,ai+1而本題要找x-1,x,x+1,所以我們可以把dp[i]的下標i替換為x即可
本題還是要注意資料範圍n*a[i]最大超過了int的資料範圍
思路比較難想,還是要多見變形題,多思考
#include
#include
using
namespace std;
const
int m=
1e5+5;
long
long a[m]
,f[m]=;
long
long dp[m]=;
intmain()
sort
(a+1
,a+n+1)
; dp[0]
=0; dp[1]
=f[1]*
1;long
long mx=dp[1]
;for
(int i=a[1]
;i<=a[n]
;i++)if
(dp[i]
>mx)
} 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 求最大分數。本題和課上講的有些許不一樣,但是核心是...
Week 10 拿數問題II
yjq 上完第10周的程式設計思維與實踐後,想到乙個絕妙的主意,他對拿數問題做了一點小修改,使得這道題變成了 拿數問題 ii。給乙個序列,裡邊有 n 個數,每一步能拿走乙個數,比如拿第 i 個數,ai x,得到相應的分數 x,但拿掉這個 ai 後,x 1 和 x 1 如果有 aj x 1 或 aj ...