Find a multiple (POJ

来源:互联网 发布:算法竞赛宝典 百科 编辑:程序博客网 时间:2024/06/05 06:35

The input contains N natural (i.e. positive integer) numbers ( N <= 10000 ). Each of that numbers is not greater than 15000. This numbers are not necessarily different (so it may happen that two or more of them will be equal). Your task is to choose a few of given numbers ( 1 <= few <= N ) so that the sum of chosen numbers is multiple for N (i.e. N * k = (sum of chosen numbers) for some natural number k).
Input
The first line of the input contains the single number N. Each of next N lines contains one number from the given set.
Output
In case your program decides that the target set of numbers can not be found it should print to the output the single number 0. Otherwise it should print the number of the chosen numbers in the first line followed by the chosen numbers themselves (on a separate line each) in arbitrary order.

If there are more than one set of numbers with required properties you should print to the output only one (preferably your favorite) of them.
Sample Input
5
1
2
3
4
1
Sample Output
2
2
3

今天是开始系统的学习关于组合数学的相关知识,其实说编程需要一些数学知识,还不如说是数学转移到了编程。这种感觉一直从我开始学习编程到现在一直都在。
今天接触的第一个知识是鸽巢原理(抽屉原理)

这个原理比较好懂:如果n+1个物体被放进n个盒子,那么至少有一个盒子包含两个或更多的物体。

  例1:在13个人中存在两个人,他们的生日在同一月份里。

  例2:设有n对已婚夫妇。为保证有一对夫妇被选出,至少要从这2n个人中选出多少人?(n+1)(引自百度)

关键是起初在实战中很少或者说想不到运用。以这道题为引子。

分析:我们可以在设置一个sum数组,在记录各个值的同事,把1到i(1<=i<=n)的和一并求出

假设在这场情况下 存在有sum[i]%n==0,我们输出即可
如果所有的sum[i]取模都没有等于0的,这里就用上这个原理,
我们把所有的sum[i]都取模,若存在两个i和j 使得sum[i]==sum[j](此时sum中存的是模数)
那么(sum[j]-sum[i])%n==0,这样就找到了一个答案,那么会不会存在两个相等的sum呢,答案是肯定有。
所以的余数情况是1到n-1,我们可以看做是箱子,而n个sum则是鸽子,也就是说,必然存在两个模相等的sum。
代码

import java.util.Scanner;public class Main {    public static void main(String[]args)    {        Scanner sc=new Scanner(System.in);        while(sc.hasNext())        {            int n=sc.nextInt();            int a[]=new int[n+1];//保存各个数,输出需要            int sum[]=new int[n+1];//和值            boolean  sign=false;//在前期用来判断有没有找到是n的倍数的值            for(int i=1;i<=n;i++)            {                a[i]=sc.nextInt();                sum[i]+=sum[i-1]+a[i];                if(!sign)                {                    if(sum[i]%n==0)                    {                        System.out.println(i);                        for(int j=1;j<=i;j++)                            System.out.println(a[j]);                        sign=true;//如果找到就置为true                    }                }            }            if(!sign)//没有找到就使用鸽巢原理            {                for(int i=1;i<=n;i++)                    sum[i]%=n;//去n的模                int v[]=new int[n];//这个就相当于是箱子                for(int i=1;i<=n;i++)                {                    if(v[sum[i]]==0)                        v[sum[i]]=i;//在箱子里村的是编号数                    else//如果不为说明之前已经有鸽子进入这个箱子,也就是说找到两个值了                    {                        int l=v[sum[i]];                        System.out.println(i-l);                        for(int j=l+1;j<=i;j++)                            System.out.println(a[j]);//输出即可                        break;                    }                }            }        }    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米小店复合通过qq群怎么办 买了火车票在订单上查不到怎么办 用支付宝付款扣款没成功怎么办 在京东买东西只收到空盒子怎么办 魅族移动数据是灰色的怎么办? 魅族手机账号密码忘记了怎么办视频 淘宝购物退货把单号写错了怎么办 天猫想退货商家不给退货地址怎么办 天天爱消除四星宠物等级已满怎么办 店不干了店里面的财神怎么办 微信显示登陆注册语言打不开怎么办 三星手机解锁以后突然不量怎么办 耐克、阿迪品牌鉴定买到假货怎么办 小米4c盒子不支持有线连接怎么办 一个手机号绑着两个小米账号怎么办 小米5s手机听筒声音小怎么办 淘宝上买手机买到翻新怎么办 小米6用久了很卡怎么办 淘宝商家发错误的退货地址怎么办 买苹果手机时查到了翻新机该怎么办 荣耀9青春版玩王者卡怎么办 红米4x手机声音突然成破音怎么办 红米pro玩王者荣耀卡怎么办 红米手机恢复出厂设置出错了怎么办 红米恢复出厂设置出错了怎么办 应聘工作上当收押金了该怎么办 红米1s密码忘了怎么办 红米1s刷机后开不了机怎么办 红米2a耗电超快怎么办 红米2a手机耗电快怎么办 红米4x触屏失灵怎么办 苹果恢复出厂设置后密码忘记怎么办 红米1s忘记密码锁屏了怎么办 红米3手机忘记解锁图案怎么办 小米5x手机录屏失败怎么办 红米4x手机wif信号不好怎么办 红米4x屏幕换了截屏不好使怎么办 红米手机2a卡慢怎么办? 红米手机连接无线网信号不好怎么办 小米4用久了很卡怎么办 红米4a关不了机怎么办