【Codeforces Global Round 7】C. Permutation Partitions 題解

題目鏈接:C. Permutation Partitions

題目

在這裏插入圖片描述
在這裏插入圖片描述

題意

給你 n 個數,把這些數分成 k 組,每組裏的最大值相加必須最大,也就是說:

找到這 n 個樹中最大的 k 個數,這些數必須各自存在於單獨的一組

解題思路

這道題其實就是高中學 Cnm 的那種排列組合的分組問題,簡單來說就是插卡

插一張卡,分成兩份,插兩張卡,分成三份。。。

而這道題更簡單,分組的間隔已經明確告訴你了,你只需要求出每兩個標值中間有幾種插卡方式即可

  1. 用 map 將【數-下標】 從大到小 存起來
  2. 求出最大的 k 個數,並將這些數的下標 從小到大 存起來
  3. 兩個數中間間隔的人數(+1)即爲分組的方法數
  4. 注意第一個人前面的所有人肯定都是跟第一個人一組的,還有記得要取餘

代碼

#include <iostream>
using namespace std;
typedef long long hip;
#include <set>
#include <map>
#include <vector>
const hip maxn = 998244353;

int main() {
        ios::sync_with_stdio(0); cin.tie(0);
        hip n, k; cin >> n >> k;
        vector<hip> v;
        map<hip, hip, greater<hip>> m;
        for (hip i = 0; i < n; i++) {
                hip a; cin >> a;
                v.push_back(a);
                m[a] = i;
        }
        hip r1 = 0;
        set<hip> s;
        for (auto a : m) {
                k -= 1;
                r1 += a.first;
                s.insert(a.second);
                if (k == 0) break;
        }
        hip r = 1;
        k = *s.begin();
        for (auto a : s) {
                n = a - k; k = a;
                if (n > 0) r = r*n % maxn;
        }
        cout << r1 << ' ' << r << endl;
        return 0;
}

請多多支持猹的個人博客,這裏的文章那裏也都有 H_On 個人小站
因爲猹的小站真的還挺可的,所以那邊更新的也比較勤奮,感謝關注~我會努力的(ง •_•)ง

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章