Week10 作業 C 拿數問題 II

2021-10-05 09:39:10 字數 1926 閱讀 1548

一、題目描述

題面

給 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你能得到最大分值。

example

input

21 2

output

2input

31 2 3

output

4input

91 2 1 3 2 2 2 2 3

output

10

hint

對於第三個樣例:先選任何乙個值為2的元素,最後陣列內剩下4個2。然後4次選擇2,最終得到10分。

二、思路概述

三、細節

由於最後的輸出結果最大值是1e5*1e5=1e10,超出了int的資料範圍,所以與之相關的資料型別應該選擇long long。

1e5,陣列卻只開了10050(五位數),所以oj系統顯示超時,自己也看不出來,在這裡感謝我的助教,幫我看出來這個弱智的錯誤。

四、完整**

#include

#include

//#include

using

namespace std;

struct nodemp[

100050];

intmain()

sort

(a, a + n)

;//mapmp;//first是數的值,second是數的數量

long

long cnt ;

long

long i =0;

long

long num;

long

long toll=0;

while(1

) mp[toll]

.shu = num;

//mp[toll].num = cnt;

mp[toll]

.sum=num*cnt;

toll++;if

(i == n)

break;}

long

long f[

100050];

//= new long long[mp.size()];

//auto it1 = mp.begin();auto it2= mp.begin();//it2是後面乙個

long

long sum =0;

//long long f1 = 0; long long f2 = 0;

long

long tol =0;

//long long tol2=0;

f[0]= mp[0]

.sum;

while

(tolelse

}printf

("%lld\n"

,f[tol]);

// cout << f[tol] << endl;

return0;

}

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

Week 10 拿數問題II

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