51Nod-1103-N的倍数

来源:互联网 发布:php crm 开源 编辑:程序博客网 时间:2024/06/06 00:36

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;}
0 0
原创粉丝点击