CodeForces - 899C Dividing the numbers 思维

http://codeforces.com/problemset/problem/899/C

题意:给你1~n连续的n个数。将这n个数分成两拨,要求两拨之差的绝对值k最小。求出这个最小的绝对值,并输出其中的一拨的数字。

题解:首先要想清楚这个k非零即一

先将问题分解成两类:奇数和偶数。

先看最简单的偶数:

由于可以组成如1,n以及2,n-1这样的数对。

①如果n%4==0。那么就有偶数组上述数对,直接构造输出即可。k就等于0。

②如果n%4!=0。那么两拨分完之后还剩下一个上述数对,那么一拨一个。很容易想到要剩下的是n/2和n/2+1。那么k等于1。

在看奇数:

①如果(n+1)%4==0。那么k=0。为什么?

以n=7为例,在分好1,7,2,6和3,5,4之后。相当于这两拨的差距在2,6和4。第一拨多了n+1,第二拨多了(n+1)/2。也就是说第一拨比第二拨多了(n+1)/2。那么第一拨就要分出(n+1)/4给第二拨(这也是为什么要满足(n+1)%4==0)。可以发现就是要交换上面的6和4,让2和4凑成一对,这样(n+1)/4和(n+1)/2凑成一对。这样k等于0。

②如果n%4!=0。那么k就不会等于0了,那么肯定存在k=1的解。

以5为例,分成1,5和2,4,3。这里是1和3互换,原理同上。

代码:

#include
#define debug cout<<"aaa"<


你可能感兴趣的:(思维)