某公司計畫推出一批投資專案。product[i] = price
表示第i
個理財專案的投資金額price
。客戶在按需投資時,需要遵循以下規則:
若對所有理財專案中最多進行limit
次交易,使得投入金額總和最大,請返回這個最大值的總和。
注意:
示例 1:
輸入:示例 2:product = [4,5,3], limit = 8
輸出:
26
解釋:滿足條件的一種情況為:
第乙個理財專案進行金額為 4,3,2 的交易;
第二個理財專案進行金額為 5,4,3 的交易;
第三個理財專案進行金額為 3,2 的交易;
得到最大投入金額總和為 5 + 4 * 2 + 3 * 3 + 2 * 2 = 26。
輸入:product = [2,1,3], limit = 20
輸出:
10
解釋:可交易總次數小於
limit
,因此進行所有交易第乙個理財專案可交易 2 次,交易的金額分別為 2,1;
第二個理財專案可交易 1 次,交易的金額分別為 1;
第三個理財專案可交易 3 次,交易的金額分別為 3,2,1;
因此所得最大投入金額總和為 3 + 2 * 2 + 1 * 3 = 10。
二分我們把 p 看作不同高度的柱子,我們需要確定某個高度劃一刀,高的全選,少的從這個高度補。如果比這個高度低,那麼就會超過 limit 個。
class solution:
def maxinvestment(self, p: list[int], limit: int) -> int:
# 二分上界和下界
a, b = 0, max(p)
while a < b:
mid = (a + b) // 2
# 高的高度
count = 0
for tmp in p:
if tmp > mid:
count += tmp - mid
# 多了,不行
if count > limit:
a = mid + 1
# 少了,行
else:
b = mid
print(b)
ans, count = 0, 0
for tmp in p:
if tmp > b:
# 記錄個數
count += tmp - b
# 高的全選,等差數列求和
ans += (tmp - b) * (b + 1 + tmp) // 2
# 不足的從這一層選
ans += b * (limit - count)
return ans % 1000000007
為了不斷提高使用者使用的體驗,開發團隊正在對產品進行全方位的開發和優化。
已知開發團隊共有若干名成員,skills[i]
表示第i
名開發人員掌握技能列表。如果兩名成員各自擁有至少一門對方未擁有的技能,則這兩名成員可以「合作開發」。
請返回當前有多少對開發成員滿足「合作開發」的條件。由於答案可能很大,請你返回答案對10^9 + 7
取餘的結果。
注意:
示例 1:
輸入:示例 2:
skills = [[1,2,3],[3],[2,4]]
輸出:
2
解釋:開發成員
[1,2,3]
和成員[2,4]
滿足「合作開發」的條件,技能1
和4
分別是對方未擁有的技術開發成員
[3]
和成員[2,4]
滿足「合作開發」的條件,技能3
和4
分別是對方未擁有的技術開發成員
[1,2,3]
和成員[3]
不滿足「合作開發」的條件,由於開發成員[3]
沒有對方未擁有的技術因此有
2
對開發成員滿足「合作開發」的條件。
輸入:
skills = [[3],[6]]
輸出:
1
解釋:開發成員
[3]
和成員[6]
滿足「合作開發」的條件因此有
1
對開發成員滿足「合作開發」的條件。
逆向考慮 + 雜湊
假如 a 和 b 不能合作,而且 a 的技能比 b 多(或相等),那麼說明什麼, b 的技能 a 都有。那麼 a 的技能是 1 2 3 ,b 的技能就是 1,2,3 的子集。
class solution:
def coopdevelop(self, skills: list[list[int]]) -> int:
# 排序後 a 不能合作的都在前面,後面也會有不能和 a 合作的
# 把這個看成有序方便討論
skills.sort(key=lambda x : len(x))
n = len(skills)
hash = defaultdict(int)
# 所有組合個數
ans = n * (n - 1) // 2
# print(skills)
# list is unhashable,tuple is hashable
hash[tuple(skills[0])] += 1
# 遍歷每個員工
for i in range(1, n):
# 得到所有子集
for j in range(len(skills[i])):
# combinations(skills[i], j + 1) skills[i] 中 j + 1 個元素的所有組合
for c in combinations(skills[i], j + 1):
ans -= hash[tuple(c)]
# 進入雜湊表
hash[tuple(skills[i])] += 1
return ans % 1_000_000_007
如果是 cpp 呢?怎麼搞?好在最多只有 4 個 skill ,數值在 1 到 1000 ,也就是說乙個 skill 可以用 10 bit 表示,最多需要 40 bit 。
class solution );
int n = skills.size();
long long ans = n;
ans = ans * (n - 1) / 2;
long long s = 0;
for (int i = 0; i < n; i++)
}ans -= hash[s];
}hash[s] += 1;
}return ans % 1000000007;
}};
位元幣面臨挑戰 Upload與中國銀聯
upload 公司是一家提供各種金融服務,並積極促進金融科技創新的公司,如今他們向大中華及香港地區的客戶提供一項新的服務,即客戶可以使用他們的銀聯卡將資金載入 到其upload錢包中。upload與中國最大的銀行卡協會 中國銀聯達成合作。upload將提供給中國銀聯客戶一系列安全 可靠 透明的金融服...
支付 中國銀聯作為收單機構的支付流程分析
中國銀聯是作為乙個為商業銀行提供跨行交易清算 方便銀行卡支付的銀行卡組織,處於中國銀行卡產業的樞紐和核心地位,對銀行卡產業發展發揮著基礎性的作用。在pos機收單業務中,銀聯扮演著重要的跨行轉接,交易清算的作用。個人認為 銀聯與商業銀行之間存在著合作與競爭的雙重關係,銀行是銀聯的股東方,雙方在業務上有...
20200503 力扣187周周賽上
旅行終點站 是否所有 1 都至少相隔 k 個元素 第一題我沒做出來,說來慚愧,菜的離譜。看大神的題解豁然開朗,這題類似之前做過的數青蛙那道題,果然還是太菜了,因為出發城市和終點城市必然是一條路徑的起點和終點。舉例子說明 a b c d e 其中包含的實際path應該是a b,b c,c d,d e,...