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;
}

UVA 11237 - Halloween treats(鸽笼原理)

时间: 2024-10-19 03:25:41

UVA 11237 - Halloween treats(鸽笼原理)的相关文章

uva 11237 - Halloween treats(抽屉原理)

题目链接:uva 11237 - Halloween treats 题目大意:有c个小孩要到邻居家去要糖果,有n户邻居,每户邻居只会提供固定数量的糖果,熊孩子们为了不发生冲突,决定将取来的糖果平均分配,问说取那几家邻居的糖果可以做到平均分配,注意n ≥ c. 解题思路:抽屉原理,求出序列的前缀和,有n个,将前缀和对c取模后,根据剩余系定理肯定是在0~c-1之间的,如果是0那么答案就不用说了,如果两端前缀和同余,则说明中间该段的和是c的倍数.又因为n ≥ c,对于取0的时候肯定是可以有解的,那么n

POJ 3370 Halloween treats(抽屉原理)

题意  有c个小孩 n个大人万圣节搞活动  当小孩进入第i个大人家里时   这个大人就会给小孩a[i]个糖果  求小孩去哪几个大人家可以保证得到的糖果总数是小孩数c的整数倍  多种方案满足输出任意一种 用s[i]表示前i个打人给糖果数的总和  令s[0]=0  那么s[i]共有n+1种不同值  而s[i]%c最多有c种不同值  题目说了c<=n   所以s[i]%c肯定会有重复值了 这就是抽屉原理了   n个抽屉放大于n个苹果   至少有一个抽屉有大于等于2个苹果 就把s[i]%c的取值个数(c

POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798   Special Judge Description Every year there is the same problem at Halloween: Each neighbour is only willing to give a certain total number of sweets

poj3370Halloween treats(鸽笼原理)

题目链接: 传送门 思路: 这个是鸽笼原理的题目...看了一下这个原理,对此的理解是分为三点.. c代表人的数目,n代表家庭的数目.. [1]首先要求前缀和,然后对此取余,首先如果出现余数为0的情况,那么说明前n项就已经满足了条件,那么这就是其中的一组可行解... [2]但是如果没有出现0呢??那么就看同余了..如果在两个点处出现同余,说明什么??说明从上一个出现同余的后一个数到这个数的和为c的倍数,那么就得到了一组可行解.. [3]题目说没有情况则输出"no sweetws",但是说

UVA 10620 - A Flea on a Chessboard(鸽笼原理)

UVA 10620 - A Flea on a Chessboard 题目链接 题意:给定一个跳蚤位置和移动方向,现在在一个国际象棋棋盘上,左下角为黑格,一个格子为s*s,判断能否移动到白格子,问要移动多少次才能到白格,边界不算白格. 思路:利用鸽笼原理落在黑格子和边界上的一共有(s + 1)^2个点,也就是说,如果形成循环,周期肯定在这之内,所以可以不断去模拟跳格子,直到踩到白格,或者踩到之前落到过的黑格就结束 不过其实还有更优的方法,因为跳蚤跳跃路径为直线,观察下可以发现如果可以到白格,最多

POJ 3370 Halloween treats(抽屉原理)

Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6631   Accepted: 2448   Special Judge Description Every year there is the same problem at Halloween: Each neighbour is only willing to give a certain total number of sweets

POJ 3370 Halloween treats 鸽巢原理 解题

Halloween treats 和POJ2356差点儿相同. 事实上这种数列能够有非常多,也能够有不连续的,只是利用鸽巢原理就是方便找到了连续的数列.并且有这种数列也必然能够找到. #include <cstdio> #include <cstdlib> #include <xutility> int main() { int c, n; while (scanf("%d %d", &c, &n) && c) { i

[POJ3370]&amp;[HDU1808]Halloween treats 题解(鸽巢原理)

[POJ3370]&[HDU1808]Halloween treats Description -Every year there is the same problem at Halloween: Each neighbour is only willing to give a certain total number of sweets on that day, no matter how many children call on him, so it may happen that a

POJ 题目3370 Halloween treats(鸽巢原理)

Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7099   Accepted: 2621   Special Judge Description Every year there is the same problem at Halloween: Each neighbour is only willing to give a certain total number of sweets