Codeforces Round #452 (Div. 2) C. Dividing the numbers(水)

C. Dividing the numbers

Petya has n integers: 1, 2, 3, ..., n. He wants to split these integers in two non-empty groups in such a way that the absolute difference of sums of integers in each group is as small as possible.

Help Petya to split the integers. Each of n integers should be exactly in one group.

Input

The first line contains a single integer n (2 ≤ n ≤ 60 000) — the number of integers Petya has.

Output

Print the smallest possible absolute difference in the first line.

In the second line print the size of the first group, followed by the integers in that group. You can print these integers in arbitrary order. If there are multiple answers, print any of them.

 

input

4

output

0
2 1 4

input

2

output

1
1 1

Note

In the first example you have to put integers 1 and 4 in the first group, and 2 and 3 in the second. This way the sum in each group is 5, and the absolute difference is 0.

In the second example there are only two integers, and since both groups should be non-empty, you have to put one integer in the first group and one in the second. This way the absolute difference of sums of integers in each group is 1.

这场B C过的人数差不多,可是B死于平年的2月写成29天,挣扎N次才发现2333.....

C题用头铁方式过,一点AC乐趣都没- -

题目大意:

1~n个数划分为两个非空集合,求两个集合各自和的差值的最小值.

解题思路:

思路1:

如1 2 3 4 5 6,显然(1,6)和(2,5)能抵消,"3","4"两集合各一个恰好差值为1.显然遵照这个思路,差值最小值不是0就是1。通过不断一对对互相消去,再判断互相消去的对数奇偶来

得出为0还是1.  当差值为1时候按从前往后,从后往前各自输出(i+=2)能抵消对数个数,再讲正中央数字直接输出即可。

而当n为奇数时,我将 (1, 2),(3)提前抵消,剩下的数遵照上面思路继续下去就是了。

由于都只是if else的判断,所以复杂度极低- -

AC(头铁)代码:

#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#include <ctype.h>
//******************************************************
#define lrt (rt*2)
#define rrt  (rt*2+1)
#define LL long long
#define inf 0x3f3f3f3f
#define pi acos(-1.0)
#define exp 1e-8
//***************************************************
#define eps             1e-8
#define inf             0x3f3f3f3f
#define INF             2e18
#define LL              long long
#define ULL             unsigned long long
#define PI              acos(-1.0)
#define pb              push_back
#define mk              make_pair

#define all(a)          a.begin(),a.end()
#define rall(a)         a.rbegin(),a.rend()
#define SQR(a)          ((a)*(a))
#define Unique(a)       sort(all(a)),a.erase(unique(all(a)),a.end())
#define min3(a,b,c)     min(a,min(b,c))
#define max3(a,b,c)     max(a,max(b,c))
#define min4(a,b,c,d)   min(min(a,b),min(c,d))
#define max4(a,b,c,d)   max(max(a,b),max(c,d))
#define max5(a,b,c,d,e) max(max3(a,b,c),max(d,e))
#define min5(a,b,c,d,e) min(min3(a,b,c),min(d,e))
#define Iterator(a)     __typeof__(a.begin())
#define rIterator(a)    __typeof__(a.rbegin())
#define FastRead        ios_base::sync_with_stdio(0);cin.tie(0)
#define CasePrint       pc('C'); pc('a'); pc('s'); pc('e'); pc(' '); write(qq++,false); pc(':'); pc(' ')
#define vi              vector <int>
#define vL              vector <LL>
#define For(I,A,B)      for(int I = (A); I < (B); ++I)
#define FOR(I,A,B)      for(int I = (A); I <= (B); ++I)
#define rFor(I,A,B)     for(int I = (A); I >= (B); --I)
#define Rep(I,N)        For(I,0,N)
#define REP(I,N)        FOR(I,1,N)
using namespace std;
const int maxn=2e5+10;
vector<int>Q[maxn];
int main()
{
    int n,ans,num;
    while(cin>>num)
    {
        if(num==2)
        {
            puts("1"); printf("1 1");
        }
        if(num%2==0&&num>2)
        {
            n=num/2;
            if(n%2==0)
            {
                puts("0");
                printf("%d",n);
                n/=2;ans=0;
                for(int i=1;i<=num&&n;i+=2)
                {
                    ans++;
                    printf(" %d",i);
                    if(ans==n)  break;
                }
                ans=0;
                for(int i=num;n;i-=2)
                {
                    ans++;
                    printf(" %d",i);
                    if(ans==n)  break;
                }
            }
            else
            {
                puts("1");
                printf("%d",n);
                n/=2;ans=0;
                for(int i=1;i<=num;i+=2)
                {
                    ans++;
                    printf(" %d",i);
                    if(ans==n)  break;
                }
                ans=0;
                for(int i=num;;i-=2)
                {
                    ans++;
                    printf(" %d",i);
                    if(ans==n)  break;
                }
                printf(" %d",num/2);
            }
        }
        else if(num%2==1&&num>2)
        { // 5 9
            n=(num-3)/2;
            if(n%2==0)
            {
                puts("0");
                printf("%d",n+1);
                printf(" 3");
                n/=2;ans=0;
                for(int i=4;i<=num&&n;i+=2)
                {
                    ans++;
                    printf(" %d",i);
                    if(ans==n)  break;
                }
                ans=0;
                for(int i=num;n;i-=2)
                {
                    ans++;
                    printf(" %d",i);
                    if(ans==n)  break;
                }
            }
            else
            { // 1   3
                puts("1");
                printf("%d",n+1);
                printf(" 3");
                n/=2;ans=0;
                for(int i=4;i<=num&&n;i+=2)
                {
                    ans++;
                    printf(" %d",i);
                    if(ans==n)  break;
                }
                ans=0;
                for(int i=num;n;i-=2)
                {
                    ans++;
                    printf(" %d",i);
                    if(ans==n)  break;
                }
                printf(" %d",(3+num)/2);
            }
        }
        cout<<endl;
    }
    return 0;
}
View Code

思路2:

求出n个数和,直接判断奇偶,得出差值为1还是0,然后除以2得出每个集合的sum应该凑到多少。

n个数两个集合必定分别为m,m+1个数字,或者分别为m,m个数,所以用sum/m得到平均值ave,然后讲ave前后的数字对分别输出,输出m/2对的数即可.

或者用sum%(m+1)后,其他数输出为(1,n),(2,n-1)这样的数字对即可,感觉这个思路复杂度更低,AC代码就是这个思路- -

AC代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[60000];
int main()
{
    int n, sum, p, s=0, q;
    scanf("%d",&n);
    if(n%2==0) sum=n/2*(n+1);
    else sum=(n+1)/2*n;
    if(sum%2==0) printf("0
");
    else printf("1
");
    p=sum/2;q=p%(n+1);
    if(q!=0) a[s++]=q;
    p-=q;
    for(int i=1; i<=n&&p!=0; i++)
    {
        if(i!=q&&(n+1-i)!=q)
        {
            a[s++]=i;
            a[s++]=n+1-i;
            p-=n+1;
        }
    }
    printf("%d", s);
    for(int i=0; i<s; i++)
        printf(" %d", a[i]);
    printf("
");
    return 0;
}
原文地址:https://www.cnblogs.com/weimeiyuer/p/8053256.html