poj2356(抽屉原理)

链接:点击打开链接

题意:给定n个数,求其中的一个集合中每个元素的值加和正好是n的倍数的集合中的元素是什么(如果有多个输出任何一个)

代码:

#include <map>
#include <set>
#include <stack>
#include <queue>
#include <string>
#include <math.h>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int siz=10005;
struct node{
    int id,sum;
    friend bool operator<(node a,node b){
        if(a.sum==b.sum)
        return a.id<b.id;
        return a.sum<b.sum;
    }
}S[siz];
int a[siz];
int main(){
    int i,j,u,n;
    while(scanf("%d",&n)!=EOF){                 //我们可以算出余数的前缀和,根据抽屉原理
        S[0].sum=0;                             //可得必然有一个前缀和等于0或者两个前缀和相等
        for(i=1;i<=n;i++){
            scanf("%d",&a[i]);
            S[i].sum=(S[i-1].sum+a[i])%n;
            S[i].id=i;
        }
        sort(S+1,S+n+1);
        if(S[1].sum==0){
            printf("%d\n",S[1].id);
            for(i=1;i<=S[1].id;i++)
            printf("%d\n",a[i]);
            continue;
        }
        for(i=1;i<n;i++){
            if(S[i].sum==S[i+1].sum){
                printf("%d\n",S[i+1].id-S[i].id);
                for(j=S[i].id+1;j<=S[i+1].id;j++)
                printf("%d\n",a[j]);
            }
        }
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值