题目链接: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++]);
else
return 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");
}
} else
printf("NO\n"); return 0;
}

最新文章

  1. DIV+CSS+JS基础+正则表达式
  2. Linux基础命令之cat使用方法大全
  3. [问题2014S02] 解答
  4. C#中引用类型和值类型
  5. 深入分析:Fragment与Activity交互的几种方式(三,使用接口)
  6. 自己写的demo---equals()跟==的区别
  7. TC598 div2
  8. 【转】Ubuntu下配置samba服务器--不错
  9. DBA日常工作职责 - 我对DBA的七点建议
  10. ccf 火车购票
  11. Linux常用命令(一)--系统命令
  12. B树与B+ 树
  13. 一个真实的Async/Await示例
  14. numpy.asmatrix的用法
  15. Ontology Relations
  16. window下的窗口事件-js
  17. 【LOJ】#2265. 「CTSC2017」最长上升子序列
  18. redis知识总汇
  19. jQuery Easyui Datagrid相同连续列合并扩展
  20. bzoj1177 [Apio2009]Oil 二维前缀最大值,和

热门文章

  1. hdu3873 有约束条件的最短路
  2. ACM:回溯,八皇后问题,素数环
  3. session与cookie的差别
  4. hdu - 5045 - Contest(国家压缩dp)
  5. Net程序员学习Linux
  6. HDU4870:Rating(DP)
  7. easyui动力头 &amp;amp;&amp;amp; 动态加入tabs
  8. C++primer读书笔记9-转换和类类型
  9. 阅读&amp;lt;反欺骗的艺术&amp;gt;思考
  10. 移动应用开发(IOS/android等一下)在一般图像缓存方案评述(附流程图)