poj 3370 Halloween treats

题目链接:http://poj.org/problem?id=3370

题意:每组给你一个数c和一个数m,输入m个数,让你输出若干个数的下标,这些数加起来可以整除c(c小于等于n),鸽巢原理同样适用,

需要注意的是,sum可能会溢出int, 并且用scanf读入防止超时。

代码:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <ctype.h>

#include <math.h>

#include <iostream>

#include <string>

#include <queue>

#include <stack>

#include <vector>

#include <algorithm>

#define N 100000+100



using namespace std;



int a[N];

long long int sum[N];

int yu[N];



struct node

{

    bool k;

    int pos;



}q[N];





int main()

{

    int n, c;

    int i, j;

    int left, right;



    while(~scanf("%d %d", &c, &n))

    {

        if(c==0 && n==0) break;

        bool flag1=false;

        bool flag2=false;



        for(i=0; i<n; i++){

            scanf("%d", &a[i] );

            if(i==0) sum[i]=a[i];

            else sum[i]=sum[i-1]+a[i];

        }

        left=0;

        memset(q, 0, sizeof(q));



        for(i=0; i<n; i++){

            yu[i]=sum[i]%c;

            if(yu[i]==0){

                flag1=true; right=i; break;

            }

            else{

                if(q[yu[i]].k ){

                    flag2=true;

                    left=q[yu[i]].pos; right=i; break;

                }else{

                    q[yu[i]].k=true; q[yu[i]].pos=i;

                }

            }

        }

        if(flag1){

            //printf("%d\n", right+1 );

            for(i=0; i<=right; i++){

                if(i==0) printf("%d", i+1 );

                else printf(" %d", i+1);

            }

            printf("\n");

        }

        else if(flag2){

            //printf("%d\n", right-left );

            for(i=left+1; i<=right; i++){

                if(i==left+1) printf("%d", i+1);

                else printf(" %d", i+1 );

            }

            printf("\n");

        }

    }

    return 0;

}

 这是网上一个人写的代码,比较简短:http://www.cnblogs.com/ACShiryu/archive/2011/08/09/poj3370.html  可供参考学习。

你可能感兴趣的:(poj)