一、題目描述
題面
給 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分。二、思路概述
三、細節
由於最後的輸出結果最大值是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 ...