首页 > 代码库 > UVA 11237 - Halloween treats(鸽笼原理)
UVA 11237 - Halloween treats(鸽笼原理)
11237 - Halloween treats
题目链接
题意:有c个小伙伴,n个房子(c <= n),每个房子会给ai个糖果,要求选一些房子,使得得到的糖果能平均分给小伙伴,输出方案
思路:c <= n 这个条件很关键,如果有这个条件,那么就可以开一个sum[i]记录0 - i的前缀和%c的值,这样一来在长度n的数组中,必然会出现重复的两个值,用sum[i] - sum[j] == 0这个区间就必然是所求的答案
代码:
#include <cstdio> #include <cstring> const int N = 100005; int c, n, a[N], sum[N], vis[N]; void solve() { memset(vis, -1, sizeof(vis)); vis[0] = 0; for (int i = 1; i <= n; i++) { sum[i] = (sum[i - 1] + a[i]) % c; if (vis[sum[i]] != -1) { for (int j = vis[sum[i]] + 1; j < i; j++) printf("%d ", j); printf("%d\n", i); return; } vis[sum[i]] = i; } } int main() { while (~scanf("%d%d", &c, &n) && c + n) { for (int i = 1; i <= n; i++) scanf("%d", &a[i]); solve(); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。