博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 899C - Dividing the numbers
阅读量:5253 次
发布时间:2019-06-14

本文共 1370 字,大约阅读时间需要 4 分钟。

传送门:

本题是一个数学问题——集合划分。

将集合{1,2,...,n}划分成两个集合,使得两个集合的元素之和的绝对差值最小。

首先,考虑最简单的操作:

第1步:将元素1和n置入集合A

第2步:将元素2和n-1置入集合B

第3步:将元素3和n-2置入集合A

……

i步:将元素in+1-i,当i为奇数时置入集合A,偶数时置入集合B

……

n/2步:将元素n/2和n/2+1置入集合B

如此,集合A中的元素之和与集合B中的元素之和相等,绝对差为0。

为保证第n/2步将元素置入集合B,则应保证n是4的整数倍。

于是,若n是4的整数倍,则划分的最小绝对差为0,集合A={1,n,3,n-2,...,n/2-1,n/2+2},集合B={2,n-1,4,n-3,...,n/2,n/2+1}。

n不可被4整除,则可以考虑预处理{1,2,...,n}的前若干项构成的集合{1,2,...,x},之后再处理集合{

x+1,...,n}。当然,为了使得集合{
x+1,...,n}易于处理,应保证其项数n-x是4的整数倍。于是,x可以取n%4。

以下是按照x值分类的预处理过程:

①若x=1,则预处理{1}:将1置入集合A,此时最小绝对差为1;

②若x=2,则预处理{1,2}:将1置入集合A,2置入集合B,此时最小绝对差为1;

③若x=3,则预处理{1,2,3}:将1和2置入集合A,3置入集合B,此时最小绝对差为0。

之后,{

x+1,...,n}的处理过程类似于最初提及的操作——可将集合{
x+1,...,n}看作{1,...,n-x}中的每一个元素增加x得到的集合,其中n-x是4的整数倍。

参考程序如下:

#include 
#define MAX_N 30010int a[MAX_N];int main(void){ int n; scanf("%d", &n); int x = n % 4; int cnt = 0; int dif; if (x == 0) dif = 0; else if (x == 1) { dif = 1; a[cnt++] = 1; } else if (x == 2) { dif = 1; a[cnt++] = 1; } else if (x == 3) { dif = 0; a[cnt++] = 1; a[cnt++] = 2; } for (int i = x + 1; i <= x + (n - x) / 2; i += 2) { a[cnt++] = i; a[cnt++] = n + x + 1 - i; } printf("%d\n%d", dif, cnt); for (int i = 0; i < cnt; i++) printf(" %d", a[i]); return 0;}

 

转载于:https://www.cnblogs.com/siuginhung/p/8053154.html

你可能感兴趣的文章
导航,头部,CSS基础
查看>>
Requests方法 -- 重定向操作
查看>>
项目实施流程概述
查看>>
js 判断滚动条是不是在浏览器底部
查看>>
[Python]小甲鱼Python视频第046课(魔法方法:描述符(Property的原理) )课后题及参考解答...
查看>>
win7 安装JDK7和JDK8后,卸载JDK8后出错
查看>>
Python——os(二)文件对象
查看>>
Java11实战:模块化的 Netty RPC 服务项目
查看>>
java 语言规范 java language specifications
查看>>
MySQL问题排查工具介绍
查看>>
JavaScript中事件绑定的三种方式
查看>>
多厂商JRE环境下Java执行优先原则
查看>>
UI auto程序结构组织方式
查看>>
前端随笔
查看>>
Java并发编程:Callable、Future和FutureTask
查看>>
Linux 常用命令四 rmdir rm
查看>>
使用JCMD采集JFR
查看>>
接下来的计划和可能会涉及的领域
查看>>
Erlang下与其他程序和语言的通信机制(1)
查看>>
mybatis原生Dao实现
查看>>