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