题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6616

题意是说n个数分别为1-n,将n个数分成k堆,能否满足每堆个数相等,数值之和相等。保证n%k=0。

构造题神马的太烦了略略略

我的构造方式是这样的,先判断每堆的个数,然后分奇偶讨论一下

每堆个数为偶时:

可以将n个数分成n/2对,如n为12时,分成1-12,2-11,3-10,4-9,5-8,6-7这样。

然后根据每堆的个数将n/2对分别放入每堆中。

如n=12,k=3时:

第一堆为1-12,2-11。

第二堆为3-10,4-9。

第三堆为5-8,6-7。

这样很好想。

每堆个数为奇时:

先用蛇型方式构造出k堆的前m-2项(m为每堆的个数)

如n=15,k=3时:

1 6 7 X X

2 5 8 X X

3 4 9 X X

三堆分别如上。

然后发现每堆现在的和为14 15 16单调递增。所以我们用剩余元素构造出一个单调递减的序列即可。

剩余元素为10 11 12 13 14 15,我们用15-11,13-12,14-10,构造出一个递减序列即可。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + ;
int main() {
int t;
scanf("%d", &t);
while (t--) {
ll n, m, k;
scanf("%lld%lld", &n, &k);
m = n / k;
ll sum = n * (n + ) / ;
if (k == ) {
printf("yes\n");
for (int i = ; i <= n; i++)
printf("%d%c", i, i == n ? '\n' : ' ');
}
else if (sum%k) {
printf("no\n");
continue;
}
else {
if (m & ) {
int num = ;
int tot = sum / k;
int tmp = n;
printf("yes\n");
for (int i = ; i <= k; i++) {
for (int j = ; j <= m - ; j++) {
int x;
if (j & )
printf("%d ", x = (j - )*k + i);
else
printf("%d ", x = j * k - i + );
if (i == )
tot -= x;
}
printf("%d %d\n", tmp, tot - tmp);
tot--;
tmp -= ;
if (tmp < n - k)tmp = n - ;
}
}
else {
int cnt = ;
printf("yes\n");
for (int i = ; i <= n / ; i++) {
cnt += ;
printf("%d %d", i, n - i + );
if (cnt == m) {
printf("\n");
cnt = ;
}
else
printf(" ");
}
}
}
}
}

最新文章

  1. 安卓图标IconFont使用
  2. IntelliJ 支持web
  3. 在github上创建新分支
  4. 2.openstack之mitaka搭建控制节点数据库和消息队列
  5. 彻底删除mysql方法
  6. 最短路&amp;&amp;最小生成树水题
  7. 中文版Windows 7下设置日语格式布局的键盘
  8. SQL SERVER 2008 R2 SP3 发布
  9. PostgreSQL的 initdb 源代码分析之二十一
  10. ubuntu apt 命令参数(转)
  11. Populating Next Right Pointers in Each Node II 解答
  12. TCP粘包/拆包问题的解决
  13. SocketServer模块
  14. LeetCode 538 Convert BST to Greater Tree 解题报告
  15. 2017-2018 ACM-ICPC Latin American Regional Programming Contest GYM101889
  16. java的排序类 Collections
  17. 001_TCP/IP TIME_WAIT状态原理及监控实战
  18. IHttpModule 和 IHttpHandler 配置方法
  19. 基于Centos7的比特币源码编译
  20. 修改微软RDP远程桌面端口

热门文章

  1. css3圆角边框
  2. 15 Spring Boot Shiro 验证码
  3. java获取当前时间的年周月季度等的开始结束时间
  4. Android开发实践:Android.mk模板
  5. WWW基本概念
  6. luogu P1217 [USACO1.5]回文质数 Prime Palindromes x
  7. mysqldump mysql数据库导入导出
  8. E. You Are Given Some Strings...
  9. elasticsearch堆内存的配置建议
  10. [CSP-S模拟测试]:计数(DP+记忆化搜索)