題目鏈接:Codeforces 439C?Devu and Partitioning of the Array?
題目大意:給出n個數,要分成k份,每份有若干個數,可是僅僅須要關注該份的和為奇數還是偶數,要求偶數堆的個數為p。
輸出方案。
代碼模擬器?
解題思路:首先先將數組依照奇偶排序。也能夠分開儲存。
然后先單獨分k-p個奇數,然后后面的就將兩個奇數當一個偶數分配。分配過程中計算是否滿足,比方說奇數是否成對,以及是否分成了k堆。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>using namespace std;
const int N = 1e5 + 5;int n, k, p, d[N];
vector<int> g[N];inline bool cmp (const int& a, const int& b) {return (a&1) > (b&1);
}void init () {scanf("%d%d%d", &n, &k, &p);for (int i = 0; i < n; i++)scanf("%d", &d[i]);sort(d, d + n, cmp);for (int i = 0; i < k; i++)g[i].clear();
}bool judge () {int mv = 0;for (int i = 0; i < k - p; i++) {if (d[mv]&1)g[i].push_back(d[mv++]);elsereturn false;}int t = k - p;while (mv < n) {t %= k;if (d[mv]&1) {g[t].push_back(d[mv++]);if ((d[mv]&1) != 1 || mv >= n)return false;g[t].push_back(d[mv++]);} else {g[t].push_back(d[mv++]);}t++;}if (g[k-1].size() == 0)return false;return true;
}int main () {init();if (judge()) {printf("YES\n");for (int i = 0; i < k; i++) {printf("%lu", g[i].size());for (int j = 0; j < g[i].size(); j++)printf(" %d", g[i][j]);printf("\n");}} elseprintf("NO\n");return 0;
}
code1083、