題目描述:
乙個袋子裡面有n個球,每個球上面都有乙個號碼(擁有相同號碼的球是無區別的)。如果乙個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。
例如:如果袋子裡面的球的號碼是,這個袋子就是幸運的,因為1 + 1 + 2 + 3 > 1 * 1 * 2 * 3
你可以適當從袋子裡移除一些球(可以移除0個,但是別移除完),要使移除後的袋子是幸運的。現在讓你程式設計計算一下你可以獲得的多少種不同的幸運的袋子。
輸入描述:
第一行輸入乙個正整數n(n ≤ 1000)
第二行為n個數正整數xi(xi ≤ 1000)
輸出描述:
輸出可以產生的幸運的袋子數
輸入例子:
3 1 1 1
輸出例子:
2 分析:
假設袋子中有數字1,1,1,1,2,2,2,2這八個數字,那麼是幸運袋子的組合就可能是:
第一種:1,1,1,1,2,2,2
第二種:1,1,1,1,2,2
第三種:1,1,1,1,2
第四種:1,1,1,1
第五種:1,1,1,2,2,2
第六種:1,1,1,2,2
第七種:1,1,1,2
第八種:1,1,1
第九種:1,1,2,2
第十種:1,1,2
第十一種:1,1
第十二種:1,2,2
第十三種:1,2
根據這種末尾不斷消長的特點,應該使用棧這個資料結構,演算法描述:首先將元素儲存在動態陣列中,對其由小到大進行排序,(為什麼要進行排序呢,因為和的增長幅度小於積的增長幅度,當我們發現將該元素新增到袋子裡,總和小於總積,那麼如果從小到大排列了,該元素後面的元素將都不滿足條件,就不用再做計算了,提高運算效率)首先將所有1壓入棧中(數字1能提高總和值但不會提高總積值,1的個數越多,和更有可能大於積),然後進行判斷壓棧,如果該元素加入棧中,棧中元素依然保持幸運,則將該元素壓入棧中,直到不滿足條件為止。下一步,迴圈操作,迴圈條件是棧不為空。如果棧不為空,進入迴圈,首先判斷當前的總sum值是否大於總multy(積)值,若大於,則棧中的數字串是幸運的,計數器自加,之後彈出該幸運數字串的最後乙個元素,並彈出它的下標,根據下標,繼續向後掃瞄陣列,跳過與該元素相同的元素,再向後掃瞄,再乙個while迴圈,判斷壓棧操作,如果壓入該元素後,棧中元素仍為幸運的,則壓棧,直到陣列末尾或者元素不是幸運的為止。當棧為空時,輸出計數器值。
**如下:
#include
#include
#include
#include
using
namespace
std;
int main(void)
sort(veci.begin(), veci.end());
int cnt = 0;
int sum = 0;
int multy = 1;
unsigned
int i = 0;
stack
sdk; // 用來儲存滿足條件的元素集合
stack
lable; // 用來儲存棧中對應元素的下標
// 先將所有的1壓入棧中
for (; i < veci.size() && veci[i] == 1; ++i)
// 找出滿足條件的最長連續串
while ( i < veci.size() )
else
;i++;
}// 當棧中元素只有乙個時,也就是只有1時,迴圈停止。
while (!sdk.empty())
; // 去掉重複的數字
if (i < veci.size() - 1 && veci[i] != veci[i] + 1)
else
i++;}}
}else
}cout
<< cnt << endl;
}
若有錯誤之處,敬請指正。 網易筆試題 幸運的袋子
乙個袋子裡面有n個球,每個球上面都有乙個號碼 擁有相同號碼的球是無區別的 如果乙個袋子是幸運的當且僅當所有球的號碼的和大於所有球的號碼的積。例如 如果袋子裡面的球的號碼是,這個袋子就是幸運的,因為1 1 2 3 1 1 2 3 你可以適當從袋子裡移除一些球 可以移除0個,但是別移除完 要使移除後的袋...
網易筆試程式設計題
時間限制 1秒 空間限制 262144k 又到了豐收的季節,恰逢小易去牛牛的果園裡遊玩。牛牛常說他對整個果園的每個地方都瞭如指掌,小易不太相信,所以他想考考牛牛。在果園裡有n堆蘋果,每堆蘋果的數量為ai,小易希望知道從左往右數第x個蘋果是屬於哪一堆的。牛牛覺得這個問題太簡單,所以希望你來替他回答。輸...
網易筆試 程式設計
1 一片1000 1000的草地,初始站在 1,1 最左上角 每一秒小易都會橫向或縱向到相鄰草地吃草 不會越界 反派超超手上有n個陷阱,第i個陷阱位置 xi,yi 小易一旦進陷阱就會 獲,為解救小易,請計算小易最少多少秒可能會走入乙個陷阱,提前提醒小易 輸入描述 第一行 n 超超的陷阱數 第二行 n...