ACM模版

描述

题解

利用抽屉原理解题。

把前缀和求出并对N取模,任意等于0则符合要求,或者任意两个sum[i]=sum[j],则[i,j]内的数的和都满足这个条件。

N个数对N取模,相当于N个抽屉,则至少有一个sum[i]等于0,或者一对儿sum[i]==sum[j](可以理解为sum[i]-sum[j]==0)。

这是一道特判题,可能有多种解,所以即使输出结果和样例不同,仍然是可以AC的,之前因为没有关注过特判题,所以,纳闷儿了半天(为毛样例都不对却AC了)……

最后说明一点,其实No Solution这种情况完全不用考虑,一定有解!

代码

#include <iostream>
#include <cstdio>

typedef long long ll;

using namespace std;

const int MAXN = 5e4 + 10;

int A[MAXN];

ll sum[MAXN];

int main(int argc, const char * argv[])
{
    int N;
    while (cin >> N)
    {
        int flag = 0;
        sum[0] = 0;
        for (int i = 1; i <= N; i++)
        {
            scanf("%d", A + i);
            sum[i] = (sum[i - 1] + A[i]) % N;
            if (sum[i] == 0)    // 从1~相加符合
            {
                flag = i;
            }
        }

        if (flag)               // 输出结果并continue
        {
            printf("%d\n", flag);
            for (int i = 1; i <= flag; i++)
            {
                printf("%d\n", A[i]);
            }
            continue;
        }

        int left = 0, right = 0;
        for (int i = 1; i <= N; i++)
        {
            for (int j = i + 1; j <= N; j++)
            {
                if (sum[i] == sum[j])
                {
                    left = i + 1;
                    right = j;
                    flag = j - i;   // 查找到结果
                    break;
                }
            }
            if (flag)               // 查找到则跳出
            {
                break;
            }
        }

        if (flag)
        {
            printf("%d\n", flag);
            for (int i = left; i <= right; i++)
            {
                printf("%d\n", A[i]);
            }
        }
        else
        {
            printf("No Solution\n");
        }
    }

    return 0;
}