酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

明朝,朱权在位期间,朝廷内有两位权臣——张居正和冯保。张居正掌管国库,而冯保掌管兵权。 某日,天子发现朝中有n名重臣的权力过于接近,这可能会导致政局不稳。他决定重新分配这n名大臣的权力。 张居正提供了一套记录这些大臣权力的册子(num),冯保则提供了一套调整这些权力所需要的代价册子(cost)。为了使得代价最小,张居正提议在调整权力前,允许冯保重新排序代价册子(cost)中的代价值。 每当增加某大臣的权力值(num[i])时,都需要消耗(cost[i])的代价。一旦开始调整,代价册子(cost)就不能再进行改动。 在这种情况下,如何使得这n名大臣的权力互不相同,并且总代价最小?结果需要对2^64取模。 输入描述 第一个一个正整数n 第二行n个正整数num[i] 第三行n个正整数cost[i] n -> [1,10^6] num,cost -> [1,10^9] 尽量不要使用cin输入,以免输入时间开销过大 输出描述 最小代价值,记得对2^64次取模

以下是使用 C++ 解决此问题的代码示例: ```cpp #include <iostream> #include <algorithm> #include <vector> using namespace std; const long long MOD = 1LL << 64; long long solve(int n, vector<int>& num, vector<int>& cost) { vector<pair<int, int>> pairs; for (int i = 0; i < n; ++i) { pairs.emplace_back(num[i], cost[i]); } sort(pairs.begin(), pairs.end()); long long ans = 0; for (int i = 0; i < n; ++i) { int cur_cost = pairs[i].second; for (int j = 0; j < i; ++j) { if (pairs[j].first == pairs[i].first) { cur_cost = min(cur_cost, pairs[j].second); } } ans += cur_cost; ans %= MOD; } return ans; } int main() { int n; scanf("%d", &n); vector<int> num(n), cost(n); for (int i = 0; i < n; ++i) { scanf("%d", &num[i]); } for (int i = 0; i < n; ++i) { scanf("%d", &cost[i]); } long long result = solve(n, num, cost); printf("%lld\n", result); return 0; } ``` 这段代码首先将权力值和代价值组合成一个对,然后按照权力值排序。在计算代价时,对于每个权力值相同的情况,选择最小的代价,并将所有代价累加,最后对 `2^64` 取模得到结果。 [2024-11-10 22:29:04 | AI写代码神器 | 421点数解答]

相关提问