力扣 中國銀聯專場周賽

2022-10-08 22:12:24 字數 3855 閱讀 2116

某公司計畫推出一批投資專案。product[i] = price表示第i個理財專案的投資金額price。客戶在按需投資時,需要遵循以下規則:

若對所有理財專案中最多進行limit次交易,使得投入金額總和最大,請返回這個最大值的總和。

注意:

示例 1:

輸入:product = [4,5,3], limit = 8

輸出:26

解釋:滿足條件的一種情況為:

第乙個理財專案進行金額為 4,3,2 的交易;

第二個理財專案進行金額為 5,4,3 的交易;

第三個理財專案進行金額為 3,2 的交易;

得到最大投入金額總和為 5 + 4 * 2 + 3 * 3 + 2 * 2 = 26。

示例 2:

輸入: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:

輸入:

skills = [[1,2,3],[3],[2,4]]

輸出:2

解釋:開發成員[1,2,3]和成員[2,4]滿足「合作開發」的條件,技能14分別是對方未擁有的技術

開發成員[3]和成員[2,4]滿足「合作開發」的條件,技能34分別是對方未擁有的技術

開發成員[1,2,3]和成員[3]不滿足「合作開發」的條件,由於開發成員[3]沒有對方未擁有的技術

因此有2對開發成員滿足「合作開發」的條件。

示例 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,...