标签:
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 6651 | Accepted: 2910 | Special Judge |
Description
Input
Output
Sample Input
5 1 2 3 4 1
Sample Output
2 2 3
分析:当不存在从下标0开始的某一段数字对n取余等于0的时候,需要找一个yu[i]和yu[j]相等,采用类似哈希的方式。
代码:
#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 10000+100 using namespace std; int a[N]; int sum[N]; int yu[N]; struct node { bool k; int pos; }q[N]; int main() { int n; int i, j; int left, right; while(~scanf("%d", &n)) { 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]%n; 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++){ printf("%d\n", a[i] ); } } else if(flag2){ printf("%d\n", right-left ); for(i=left+1; i<=right; i++){ printf("%d\n", a[i] ); } } } return 0; }
poj 2356 Find a multiple【鸽巢原理 模板应用】
标签:
原文地址:http://www.cnblogs.com/yspworld/p/4663308.html