把1到n这些数,分成两堆,让他们的差值最小,且任意输出一组。
POINT:
首先可以想到背包做,但是感觉会tle。
因为数字是连续的:
所以n%4==0时,肯定可以平分, 比如1 2 3 4 ,那么(1,4)(2,3)。比如4 5 6 7 ,那么(4,7)(5,6)
所以讨论余1,2,3时。
余1,就先挑出1,然后让2-n平分,最后任意给一个1.差值就是1
余2,就先挑出1,2,然后让3-n平分,最后每边给一个1或2,差值是1.
余3,一边给3,一边给1 2,差值为0
#include <iostream>
#include <string>
#include <string.h>
#include <math.h>
#include <vector>
#include <map>
#include <stdio.h>
#include <algorithm>
using namespace std;
int n;
int main()
{
cin>>n;
if(n%4==0){
printf("0\n");
printf("%d",n/2);
int len=n/4;
for(int i=0;i<len;i++){
printf(" %d %d",1+i,n-i);
}
}else if(n%4==1){
printf("1\n");
printf("%d",n/2);
int len=n/4;
for(int i=0;i<len;i++){
printf(" %d %d",2+i,n-i);
}
}else if(n%4==2){
printf("1\n");
printf("%d",n/2);
int len=n/4;
printf(" 1");
for(int i=0;i<len;i++){
printf(" %d %d",3+i,n-i);
}
}else if(n%4==3){
printf("0\n");
printf("%d",n/2);
int len=n/4;
printf(" 3");
for(int i=0;i<len;i++){
printf(" %d %d",4+i,n-i);
}
}
}