您的位置:首页 > 其它

51nod 1103(抽屉原理、前缀和)

2018-01-24 12:03 225 查看
/*

    51nod 1103

    抽屉原理就是说

    9个抽屉要放十个东西,必定有一个抽屉要放至少两个

    而这题的思路就是

    把每个数与前面所有数相加,然后对n取余

    就是我们所说的前缀和取余

    如果某一个等于0那么就输出包括这个数在内的之前的数

    或者找到两个相同的余数输出左端点到右端点之间,包括右端点在内的数

    因为题目特殊性

    一组数据有多组结果

    所以只要输出数据正确,即使与给定数据不同

    也能AC

*/

#include<iostream>

#include<algorithm>

#include<string.h>

#include<string>

#include<stdio.h>

#include<math.h>

#define ll long long

#define MAX 1000005

using namespace std;

int main()

{

    int n;

    cin>>n;

    int a[50005],b[50005];

    memset(a,0,sizeof(a));

    memset(b,0,sizeof(b));

    for(int i=1;i<=n;i++)

    {

        cin>>a[i];

        b[i]=(b[i-1]+a[i])%n;

    }

    int flag=0,ans,ans1,ans2;

    for(int i=1;i<=n;i++)

    {

        if(b[i]==0)

        {

            flag=1;

            ans=i;

            break;

        }

        for(int j=i+1;j<=n;j++)

        {

            if(b[j]==b[i])

            {

                flag=2;

                ans1=i;

                ans2=j;

                break;

            }

        }

        if(flag==2)

            break;

    }

    if(flag==0)

    {

        cout<<"No Solution"<<endl;

    }

    if(flag==1)

    {

        cout<<ans<<endl;

        for(int i=1;i<=ans;i++)

            cout<<a[i]<<endl;

    }

    if(flag==2)

    {

        cout<<ans2-ans1<<endl;

        for(int i=ans1+1;i<=ans2;i++)

            cout<<a[i]<<endl;

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: