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  可供参考学习。

posted @ 2015-07-21 09:38  我喜欢旅行  阅读(169)  评论(0编辑  收藏  举报