鸽巢原理-poj3370

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

#include <stdio.h>

int main(int
argc, char
*argv[])

{

        int
c = -1, n = -1;

        while
(true) {

        scanf("%d%d",&c,&n);

            int
arr[n],sum[n],b[n];

            if
(c + n == 0) {

                return
0;

            }

            for
(int i = 0; i < n; i++) {

                scanf("%d",&arr[i]);

                b[i] = -1;

            }

            sum[0] = arr[0] % c;

            b[sum[0]] = 0;

            int
temp = -1, temp1 = 0;

            for
(int i = 1; i < n; i++) {

                sum[i] = sum[i - 1] + arr[i];

                sum[i] %= c;

                if
(sum[i] == 0) {

                    temp = -1;

                    temp1 = i;

                    break;

                }

                if
(b[sum[i]] == -1) {

                    b[sum[i]] = i;

                } else
{

                    temp = b[sum[i]];

                    temp1 = i;

                    break;

                }

            }

            for
(int i = temp+1 ; i <= temp1; i++) {

                printf("%d%s",i+1," ");

            }

            printf("\n");

        }

    return
0;

}

鸽巢原理-poj3370,布布扣,bubuko.com

时间: 2024-12-27 10:01:44

鸽巢原理-poj3370的相关文章

[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

POJ3370&amp;HDU1808 Halloween treats【鸽巢原理】

题目链接: http://poj.org/problem?id=3370 http://acm.hdu.edu.cn/showproblem.php?pid=1808 题目大意: 给你两个整数C和N,再给你N个正数的序列,从中找到若干数,使得其和刚好是 C 的倍数.输出这些数的序号. 解题思路: 典型的抽屉原理. Sum[i]为序列中前 i 项的和.则有两种可能: 1.若有 Sum[i] 是 C 的倍数,则直接输出前 i 项. 2.如果没有任何的 Sum[i] 是 C 的倍数,则计算 ri =

POJ 2356 &amp;&amp; POJ 3370 鸽巢原理

POJ 2356: 题目大意: 给定n个数,希望在这n个数中找到一些数的和是n的倍数,输出任意一种数的序列,找不到则输出0 这里首先要确定这道题的解是必然存在的 利用一个 sum[i]保存前 i 个数的和对n的取模 sum[0] = 0; 那么sum[0] ~ sum[n]有n+1个数据,这些数据的范围都是 0~n , 要是存在 sum[i] = 0,那么输出前 i 个数据即可 要是不存在那根据鸽巢原理可以说明必然能找到一个 sum[i] = sum[j]  ,那么说明 (sum[i+1] +

鸽巢原理简单应用

http://poj.org/problem?id=2356 从n个数里面取出一些数,这些数的和是n的倍数.并输出这些数. 先预处理出前n个数的和用sum[i]表示前i个数的和.若某个sum[i]是n的倍数,直接输出前i个数即可. 否则说明n个数中对n取余的结果有n-1种,即余数为(1~n-1),根据鸽巢原理知必定至少存在两个sum[i]与sum[j]对n取余的结果相等.那么i+1 ~ j之间的数之和一定是n的倍数. #include <stdio.h> #include <iostre

poj 2356 Find a multiple 鸽巢原理的简单应用

题目要求任选几个自然数,使得他们的和是n的倍数. 由鸽巢原理如果我们只选连续的数,一定能得到解. 首先预处理前缀和模n下的sum,如果发现sum[i]==sum[j] 那么(sum[j]-sum[i])%n一定为0,直接输出i+1~j就够了. 为什么一定会有解,因为sum从1~n有n个数,而模n下的数只有0~n-1,把n个数放入0~n-1个数里,怎么也会有重复,所以这种构造方法一定没问题. 其实可以O(n)实现,嫌麻烦,就二重循环无脑了. #include <iostream> #includ

骚操作之鸽巢原理

桌上有十个苹果,要把这十个苹果放到九个抽屉里,无论怎样放,我们会发现至少会有一个抽屉里面至少放两个苹果.这一现象就是我们所说的"抽屉原理". 抽屉原理的一般含义为:"如果每个抽屉代表一个集合,每一个苹果就可以代表一个元素,假如有n+1个元素放到n个集合中去,其中必定有一个集合里至少有两个元素." 抽屉原理有时也被称为鸽巢原理.它是组合数学中一个重要的原理. 在acm中也是会遇到的,比如两个人对打的得分问题 110个人参加一个国际象棋单循环比赛,每两人都进行一局比赛,

HDU 1205.吃糖果【鸽巢原理】【8月1】

吃糖果 Problem Description HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样:可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下. Input 第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=10000

POJ 2356 Find a multiple 鸽巢原理

题目来源:POJ 2356 Find a multiple 题意:n个数 选出任意个数 使得这些数的和是n的倍数 思路:肯定有解 并且解是连续的一段数 证明: 假设有m个数 a1,a2,a3...am    s1 s2 s3...sm为前缀和 s1 = a1 s2 = a1+a2 s3 = a1+a2+a3... sm = a1+a2+a3+...+am 1.如果某个前缀和si%m == 0 那么得到解 2.设x1=s1%m x2 = s2%m x3 = s3%m xm = sm%m 因为1不成

HDU3183(RMQ+鸽巢原理)

题目的意思是对于一个n位数,删除m个位后,得到的最小数是什么,比如12345 2,删除两个位,得到最小的就是123.实际上这题目解法很多,好像有贪心,线段树,RMQ等,因为我最近在学习RMQ,所以就用RMQ了. 这题目用了一个鸽巢原理,得到的m-n位数的第一位,必然出现在1~m-n+1,这个由鸽巢原理就十分明显了(如果1~n-(m-n)+1都没有的话,剩下的m-n-1个位是不可能凑出m-n个位的数的!)这样我们就可以从[1,n-(m-n)+1]中作RMQ取得最小值下标i,之后对于i+1后,m-n