第八届真题-第八题:包子凑数

2024-02-28 06:18

本文主要是介绍第八届真题-第八题:包子凑数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。

每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。

当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼,分别能放4、5和6个包子。而顾客想买7个包子时,大叔就凑不出来了。

小明想知道一共有多少种数目是包子大叔凑不出来的。

输入

第一行包含一个整数N。(1 <= N <= 100) 
以下N行每行包含一个整数Ai。(1 <= Ai <= 100)

输出

一个整数代表答案。如果凑不出的数目有无限多个,输出INF。

例如, 
输入: 


5

程序应该输出: 
6

再例如, 
输入: 


6

程序应该输出: 
INF

样例解释: 
对于样例1,凑不出的数目包括:1, 2, 3, 6, 7, 11。 
对于样例2,所有奇数都凑不出来,所以有无限多个。

资源约定: 
峰值内存消耗(含虚拟机) < 256M 
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。 
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。 

注意:主类的名字必须是:Main,否则按无效代码处理。

思路:定义一个大数组,下标代表包子数,如凑到,值置为1。
令n= 最小笼包子数
最后,当满足连续n个数被凑齐,那说明后面的均能凑齐。
比如:有两笼包子,包子数为4、5。
他们能凑齐12,13,14,15连续四笼包子,那么后面的便都可凑齐,16 = 12+4;17=13+4.。。。。
代码如下:


package com.shanshi.shengsai2017;import java.util.ArrayList;
import java.util.Scanner;public class Test08 {static int[] v = new int[10000];static int[] s;public static void main(String[] args) {Scanner sc = new Scanner(System.in);ArrayList<Integer> a = new ArrayList<Integer>();int n = sc.nextInt();s = new int[n];int min = Integer.MAX_VALUE;for (int i = 0; i < s.length; i++) {s[i] = sc.nextInt();if (min > s[i]) {min = s[i];}}if (min == 1) {// 为一,便都可凑齐System.out.println(0);return;}s(0);int code = 0;while (code + min < v.length) {boolean b = true;for (int i = code; i < code + min; i++) {// 每次匹配min笼包子if (v[i] == 0) {b = false;a.add(i);}}if (b)break;code = code + min;}if (code + min >= 10000) {// 说明到了10000还没找到连续的包子数,说明无解System.out.println("INF");return;}System.out.println(a.size());}public static void s(int code) {if (code >= 10000)return;if (v[code] == 1)return;v[code] = 1;for (int i = 0; i < s.length; i++) {s(code + s[i]);}}
}

附别人的代码

(背包+欧几里德)

import java.util.Scanner;public class Main {static int dp[] = new int[10000];public static boolean judge(int x, int y) {int t;while (y > 0) {t = x % y;x = y;y = t;}if (x == 1)return true;return false;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int a[] = new int[200];int n = 0, i, j, res, mark;n = scanner.nextInt();while (true) {res = 0;mark = 0;for (i = 1; i <= n; i++) {a[i] = scanner.nextInt();}for (i = 1; i <= n; i++) {for (j = 1; j <= n; j++) {if (judge(a[i], a[j])) {mark = 1;break;}}if (mark == 1)break;}if (mark != 1) {System.out.println("INF");continue;}dp[0] = 1;for (i = 1; i <= n; i++)for (j = 1; j < 10000; j++) {if (a[i] > j)continue;if (dp[j - a[i]] == 1)dp[j] = 1;}for (i = 0; i < 10000; i++) {if (dp[i] != 1)res++;}System.out.println(res);}}
}

这篇关于第八届真题-第八题:包子凑数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/754609

相关文章

华为OD机试真题-学生方阵-2024年OD统一考试(E卷)

题目描述 学校组织活动,将学生排成一个矩形方阵。 请在矩形方阵中找到最大的位置相连的男生数量。这个相连位置在一个直线上,方向可以是水平的,垂直的,成对角线的或者呈反对角线的。 注:学生个数不会超过10000 输入描述 输入的第一行为矩阵的行数和列数, 接下来的 n行为矩阵元素,元素间用""分隔。 输出描述 输出一个整数,表示矩阵中最长的位

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

大厂算法例题解之网易2018秋招笔试真题 (未完)

1、字符串碎片 【题目描述】一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,“aaabbaaac” 是由下面碎片组成的:‘aaa’,‘bb’,‘c’。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的 平均长度是多少。 输入描述: 输入包括一个字符串 s,字符串 s 的长度 length(1 ≤ length ≤ 50),s 只含小写字母(‘a’-‘z’) 输出描述

上海大学《2022年836+915自动控制原理真题及答案》 (完整版)

Part1:2022年上海大学真题题目 学硕836 专硕915 Part2:2022年上海大学真题答案 学硕836 专硕915

华为OD机试真题-猜字谜-2024年OD统一考试(E卷)

题目描述 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如 nesw,玩家需要猜出谜底库中正确的单词。猜中的要求如下.对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 1、变换顺序以后一样的,比如通过变换 w和e的顺序,“nwes”跟“news”是可以完全对应的: 2、字母去重以后是一样的,比如“woood”和“wood”是一样的,它们去重后都是“wod'请你写一个程序帮忙在

2024年六月英语四级真题及解析PDF共9页

2024年六月英语四级真题及解析PDF共9页,真题就是最好的复习资料,希望对大家有所帮助。

2024年6月第2套英语四级真题PDF

2024年6月第2套英语四级真题PDF

第八届蓝桥杯 最大公共子串(动态规划)

标题:最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少。 比如:"abcdkkk" 和 "baabcdadabc", 可以找到的最长的公共子串是"abcd",所以最大公共子串长度为4。 下面的程序是采用矩阵法进行求解的,这对串的规模不大的情况还是比较有效的解法。 请分析该解法的思路,并补全划线部分缺失的代码。 #include <stdio.h

蓝桥杯第八届 方格分割(dfs)

标题:方格分割6x6的方格,沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图:p1.png, p2.png, p3.png 就是可行的分割法。试计算:包括这3种分法在内,一共有多少种不同的分割方法。注意:旋转对称的属于同一种分割法。请提交该整数,不要填写任何多余的内容或说明文字。   观察可得他是一个中心对称图形,我们只需要搜索它的对称线即可。我们可以把对称线抽象为从(

计算机二级真题--程序设计大题 章节

1.计算sum的时候一般用double类型而不是int类型(要注意看题目中的格式) 2.判断素数是设置一个变量使其从2开始无论如何变化都不被输入的值整除,即都不为0即可 3.求最值思路,将一组数据中的第一个元素设置为最大值最小值,然后让这个元素和其他元素对比 则后面的数组需要从i=1开始循环 4.记得将指针初始化为0 5.如果初始化S则需要给其赋值,比如赋值0或者1; 6.如果返回的是