山东科技大学第二届ACM程序设计大赛试题
ACM2th校内赛热身赛题目详解及指导书
int main() {
int y,m,d; int yy,mm,dd; int day=10000; scanf("%d%d%d",&y,&m,&d); yy=y; mm=m; day-=(mon(yy,mm)-d); while (1) {
if (mm==12) {
yy++; mm=1; } else mm++; if (day<=mon(yy,mm)) break; day-=mon(yy,mm); } dd=day; printf("%d-%d-%d\n",yy,mm,dd); return 0; }
switch(m) { case 1: case 3: case 5: case 7: case 8: case 10: case 12:return 31;break; case 4: case 6: case 9: case 11:return 30;break;
case 2:if (y%4==0 && y%100!=0 || y%400==0) return 29; else return 28; break;
输入: 输入数据包含多组测试用例,每个测试用例的第一行包含一个整数 n,表示一共有 n 个
互不相同的点。接下来的 n 行每行包含 2 个整数 xi,yi,表示平面上第 i 个点的 x 与 y 坐标。 其中 1<=n<=50 , 0<=xi,yi<=1000。数据以 n=0 时结束,测试数据不超过 20 组。
else if ((sli[j]>=65 && sli[j]<=90 || sli[j]>=97 && sli[j]<=122) && letter==comma)
ACM题库完整版
#include<stdio.h> int type(int); char week[7][10]={"saturday","sunday","monday","tuesday","wednesday","thursday","friday"}; int year[2]={365,366}; int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31}; int main(void) { int days,dayofweek; int i=0,j=0; while(scanf("%d",&days)&&days!=-1) { dayofweek=days%7; for(i=2000;days>=year[type(i)];i++) days-=year[type(i)]; for(j=0;days>=month[type(i)][j];j++) days-=month[type(i)][j]; printf("%d-%02d-%02d%s\n",i,j+1,days+1,week[dayofweek]); } return 0; } int type(int m) { if(m%4!=0||(m%100==0&&m%400!=0)) return 0; else return 1; }
登山
1.题目描述 五一到了,NUIST-ACM队组织大家去登 山观光,队员们发现山上一个有N个景点, 并且决定按照顺序来浏览这些景点,即 每次所浏览景点的编号都要大于前一个 浏览景点的编号。同时队员们还有另一 个登山习惯,就是不连续浏览海拔相同 的两个景点,并且一旦开始下山,就不 再向上走了。队员们希望在满足上面条 件的同时,尽可能多的浏览景点,你能 帮他们找出最多可能浏览的景点数么? 2.输入 Line 1: N (2 <= N <= 1000) 景点数 Line 2: N个整数,每个景点的海拔 3.输出 最多能浏览的景点数 4.样例输入 8 186 186 150 200 160 130 197 220 5.样例输出 4
acm程序设计大赛试题
acm程序设计大赛试题ACM(Association for Computing Machinery)程序设计大赛是一项面向大学生的编程竞赛,旨在提高参赛者在算法和数据结构方面的能力。
每年都会举办多个级别的比赛,包括区域赛、国家赛和世界总决赛。
ACM程序设计大赛试题通常涵盖广泛的计算机科学和编程知识,包括但不限于以下几个方面:1. 算法和数据结构,试题可能涉及各种经典算法和数据结构的应用,如排序、查找、图论、动态规划、贪心算法等。
参赛者需要能够理解这些算法的原理和实现方法,并能够根据问题的要求选择合适的算法进行解题。
2. 编程语言和编程技巧,参赛者需要熟练掌握至少一种编程语言,通常是C++、Java或Python。
他们需要能够使用该语言进行编程,实现算法和数据结构的代码,并能够处理输入输出、异常处理等编程任务。
此外,熟练掌握一些编程技巧,如优化算法、调试代码等也是非常重要的。
3. 数学和逻辑思维,ACM程序设计大赛试题可能涉及一些数学和逻辑问题,如数论、组合数学、概率统计等。
参赛者需要具备基本的数学知识,并能够将其应用到解题过程中。
4. 实际问题的建模和解决,ACM程序设计大赛试题通常基于实际问题,参赛者需要能够将问题抽象为计算机可解决的形式,并设计出高效的算法和数据结构进行求解。
这需要参赛者具备一定的问题建模和解决能力。
5. 时间和空间复杂度分析,参赛者在解决问题时需要考虑算法的时间和空间复杂度。
他们需要能够分析算法的运行时间和所需内存,并根据比赛规则和问题要求选择合适的算法以保证程序的效率。
总的来说,ACM程序设计大赛试题要求参赛者具备扎实的计算机科学和编程基础,能够独立思考和解决复杂的问题。
参赛者需要在规定的时间内完成试题,并保证程序的正确性和效率。
通过参加ACM程序设计大赛,参赛者能够提升自己的编程能力和解决问题的能力,同时也能够与其他优秀的程序员交流和学习。
acm程序设计大赛试题
acm程序设计大赛试题题目:旅游管理系统一、问题描述随着信息技术的飞速发展,旅游业作为全球经济的重要组成部分,其管理和服务水平也在不断提升。
为了更好地服务游客,提高工作效率,我们计划开发一个旅游管理系统。
该系统旨在帮助旅游公司管理客户信息、行程安排、预订情况以及费用结算等业务。
本文将详细介绍该系统的设计要求和功能特点。
二、功能需求1. 客户信息管理系统应能够记录客户的基本信息,包括姓名、联系方式、身份证号码等。
同时,应支持对客户信息的增加、修改和查询功能。
此外,系统还应具备客户信息的分类和统计功能,便于旅游公司对客户群体进行分析。
2. 行程安排旅游公司需要根据客户需求和旅游资源情况,为客户制定合适的旅游行程。
系统应提供行程规划功能,包括景点选择、活动安排、住宿和交通预订等。
同时,系统应能够根据实际情况调整行程,并及时更新相关信息。
3. 预订管理系统应能够处理客户的旅游预订,包括景点门票、酒店房间、交通工具等。
预订管理功能应包括预订的创建、修改、取消和确认等操作,并能够实时更新预订状态,确保信息的准确性。
4. 费用结算旅游费用的结算是旅游管理系统的核心功能之一。
系统应能够根据客户的预订情况和实际消费,自动计算应付费用。
同时,系统还应支持多种支付方式,如信用卡、支付宝、微信支付等,并能够生成详细的费用清单和发票。
5. 数据安全与备份鉴于旅游管理系统中涉及大量敏感信息,系统必须具备严格的数据安全措施。
包括但不限于用户权限管理、数据加密、防止SQL注入等。
此外,系统还应定期进行数据备份,以防数据丢失或损坏。
三、系统架构设计1. 前端设计系统的前端设计应注重用户体验,界面友好、操作简便。
可以使用HTML5、CSS3和JavaScript等技术开发响应式网页,以适应不同设备和屏幕尺寸。
同时,前端应提供丰富的交互功能,如日历选择、地图展示、图片上传等。
2. 后端设计后端设计主要负责处理业务逻辑、数据存储和安全保障。
大学ACM考试题目及作业答案整理
ACM作业与答案整理1、平面分割方法:设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
#include <iostream.h>int f(int n){if(n==1) return 2;else return f(n-1)+2*(n-1);}void main(){int n;while(1){cin>>n;cout<<f(n)<<endl;}}2、LELE的RPG难题:有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.编程全部的满足要求的涂法.#include<iostream.h>int f(int n){if(n==1) return 3;else if(n==2) return 6;else return f(n-1)+f(n-2)*2;}void main(){int n;while(1){cin>>n;cout<<f(n)<<endl;}}3、北大ACM(1942)Paths on a GridTime Limit: 1000MS Memory Limit: 30000K DescriptionImagine you are attending your math lesson at school. Once again, you are bored because your teacher tells things that you already mastered years ago (this time he's explaining that (a+b)2=a2+2ab+b2). So you decide to waste your time with drawing modern art instead.Fortunately you have a piece of squared paper and you choose a rectangle of size n*m on the paper. Let's call this rectangle together with the lines it contains a grid. Starting at the lower left corner of the grid, you move your pencil to the upper right corner, taking care that it stays on the lines and moves only to the right or up. The result is shown on the left:Really a masterpiece, isn't it? Repeating the procedure one more time, you arrive with the picture shown on the right. Now you wonder: how many different works of art can you produce?InputThe input contains several testcases. Each is specified by two unsigned 32-bit integers n and m, denoting the size of the rectangle. As you can observe, the number of lines of the corresponding grid is one more in each dimension. Input is terminated by n=m=0.OutputFor each test case output on a line the number of different art works that can be generated using the procedure described above. That is, how many paths are there on a grid where each step of the path consists of moving one unit to the right orone unit up? You may safely assume that this number fits into a 32-bit unsigned integer.Sample Input5 41 10 0Sample Output1262#include<iostream>using namespace std;long long f(long long m, long long n){if(n==0) return 1;else return f(m-1,n-1)*m/n;}int main(){long long m,n;while(scanf("%I64d %I64d",&n,&m) && n+m){printf("%I64d\n",f(m+n,min(m,n)));}return 0;}1、北大ACM(1012)JosephTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 31213 Accepted: 11700 DescriptionThe Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, . . ., n, standing in circle every mth is going to be executed and only the life of the last remaining person will be saved. Joseph was smart enough to choose the position of the last remaining person, thus saving his life to give us the message about the incident. For example when n = 6 and m = 5 then the people will be executed in the order 5, 4, 6, 2, 3 and 1 will be saved.Suppose that there are k good guys and k bad guys. In the circle the first k are good guys and the last k bad guys. You have to determine such minimal m that all the bad guys will be executed before the first good guy.题目大意:编号为1,2…, n的n个人排成一圈,从第一个人开始,去掉后面的第m个人,在从第m+1个人开始去掉后面第m个人,以此类推。
acm算法经典例题
一、数论1: Wolf and Rabbit描述There is a hill with n holes around. The holes are signed from 0 to n-1.A rabbit must hide in one of the holes. A wolf searches the rabbit in anticlockwise order. The first hole he get into is the one signed with 0. Then he will get into the hole every m holes. For example, m=2 and n=6, the wolf will get into the holes which are signed 0,2,4,0. If the rabbit hides in the hole which signed 1,3 or 5, she will survive. So we call these holes the safe holes.输入The input starts with a positive integer P which indicates the number of test cases. Then on the following P lines,each line consists 2 positive integer m and n(0<m,n<2147483648).输出For each input m n, if safe holes exist, you should output "YES", else output "NO" in a single line.样例输入21 22 2样例输出NOYES翻译:描述一座山有n个洞,洞被标记为从0到n-1。
acm竞赛试题及答案
acm竞赛试题及答案ACM竞赛试题及答案1. 问题描述:给定一个整数数组,找出数组中没有出现的最小的正整数。
2. 输入格式:第一行包含一个整数n,表示数组的长度。
第二行包含n个整数,表示数组的元素。
3. 输出格式:输出一个整数,表示数组中没有出现的最小的正整数。
4. 样例输入:53 4 1 2 55. 样例输出:66. 问题分析:首先,我们需要理解题目要求我们找出数组中缺失的最小正整数。
这意味着我们需要检查数组中的每个元素,并确定最小的正整数是否在数组中。
7. 算法描述:- 遍历数组,使用一个哈希集合记录出现的数字。
- 从1开始,检查每个正整数是否在哈希集合中,直到找到不在集合中的最小正整数。
8. 代码实现:```pythondef find_missing_positive(nums):seen = set()for num in nums:if num <= 0:continuewhile num in seen or num > len(nums):num += 1seen.add(num)return min(set(range(1, len(nums) + 1)) - seen)```9. 测试用例:- 输入:[3, 4, -1, 1]- 输出:210. 答案解析:在给定的测试用例中,数组[3, 4, -1, 1]中没有出现的最小正整数是2。
这是因为-1不是正整数,所以可以忽略。
数组中已经出现了1和3,所以下一个最小的正整数就是2。
11. 注意事项:- 确保数组中的元素是整数。
- 考虑数组中可能包含0或负数的情况。
- 算法的时间复杂度应尽可能低。
12. 扩展思考:- 如果数组非常大,如何优化算法?- 如果数组中的元素可以是浮点数,算法应该如何修改?13. 参考答案:- 针对大数组,可以考虑使用更高效的数据结构,如平衡二叉搜索树。
- 如果元素是浮点数,需要先将其转换为整数,然后再进行处理。
acm大赛试题及答案
acm大赛试题及答案ACM大赛试题及答案1. 题目一:字符串反转问题描述:编写一个程序,输入一个字符串,输出其反转后的字符串。
输入格式:输入包含一个字符串,字符串长度不超过100。
输出格式:输出反转后的字符串。
示例:输入:hello输出:olleh答案:```pythondef reverse_string(s):return s[::-1]input_string = input().strip()print(reverse_string(input_string))```2. 题目二:计算阶乘问题描述:编写一个程序,输入一个非负整数n,输出n的阶乘。
输入格式:输入包含一个非负整数n,n不超过20。
输出格式:输出n的阶乘。
示例:输入:5输出:120答案:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n - 1)n = int(input())print(factorial(n))```3. 题目三:寻找最大数问题描述:给定一个包含n个整数的数组,找出数组中的最大数。
输入格式:输入包含一个整数n,表示数组的大小,随后是n个整数。
输出格式:输出数组中的最大数。
示例:输入:5 1 2 3 4 5输出:5答案:```pythonn = int(input())numbers = list(map(int, input().split()))max_number = max(numbers)print(max_number)```4. 题目四:判断闰年问题描述:编写一个程序,输入一个年份,判断该年份是否为闰年。
输入格式:输入包含一个整数,表示年份。
输出格式:如果输入的年份是闰年,则输出"Yes",否则输出"No"。
示例:输入:2000输出:Yes答案:```pythonyear = int(input())if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):print("Yes")else:print("No")```5. 题目五:斐波那契数列问题描述:编写一个程序,输入一个非负整数n,输出斐波那契数列的第n项。
C语言acm竞赛习题集锦
目录1、数塔问题 (2)2、并查集类问题 (4)3、递推类问题 (9)4、动态规划系列 (10)5、概率类题型 (13)6、组合数学类题型 (15)7、贪心策略 (16)8、几何问题 (19)数塔Problem Description在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?已经告诉你了,这是个DP的题目,你能AC吗?Input输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
Output对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
Sample Input1573 88 1 02 7 4 44 5 2 6 5Sample Output 30#include<stdio.h>#include<string.h>#define MAX 101int arr[MAX][MAX][2];void res(){int n; int i,j;memset(arr,0,MAX*MAX*sizeof(int));scanf("%d",&n);for(i=0;i<n;i++) //输入数塔for(j=0;j<=i;j++) { scanf("%d",&arr[i][j][0]); arr[i][j][1]=arr[i][j][0]; }for(i=n-2;i>=0;i--){for(j=0;j<=i;j++){if(arr[i+1][j][1]>arr[i+1][j+1][1]) arr[i][j][1]+=arr[i+1][j][1];else arr[i][j][1]+=arr[i+1][j+1][1];}}printf("%d\n",arr[0][0][1]);}int main(){int num;scanf("%d",&num);while(num--) { res(); }return 0;}Problem Description都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。
程序设计大赛试题及答案()
试题1、数学黑洞(程序文件名maths.c/maths.cpp)【问题描述】任给一个4位正整数,其各位数位上的数字不全相同,将数字重新组合成一个最大的数与最小的数相减,重复这个过程,最多7步,必得6174。
对任给的4位正整数(各位数位上的数字不全相同),编程输出掉进黑洞的步数。
【输入】一行,一个4位正整数n(1000< n<9999)【输出】掉进黑洞的步数输入1234输出32、进制转换(程序文件名conver.c/conver.cpp)【问题描述】任给一个十进制整数n,及正整数m(m<=16且m≠10), 将n转换成m进制并输出。
【输入】一行,两个整数n,m(0 ≤ n ≤ 500000,2 ≤ m ≤ 16,且m≠10),中间用一个空格隔开,其中n 表示十进制数。
【输出】转换后的数【输入输出样例】输入255 8输出3773、分数线划定(程序文件名score.c/score.cpp)【问题描述】公务员选拔工作正在 A 市如火如荼的进行。
为了选拔优秀人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。
面试分数线根据计划录取人数的150%划定,即如果计划录取m名公务员,则面试分数线为排名第m*150%(向下取整)名的选手的分数,而最终进入面试的选手为笔试成绩不低于面试分数线的所有选手。
现在就请你编写程序划定面试分数线,并输出所有进入面试的选手的报名号和笔试成绩。
【输入】第一行,两个整数n,m(5 ≤ n ≤ 5000,3 ≤ m ≤ n),中间用一个空格隔开,其中n 表示报名参加笔试的选手总数,m 表示计划录取的人数。
输入数据保证m*150%向下取整后小于等于n。
第二行到第 n+1 行,每行包括两个整数,中间用一个空格隔开,分别是选手的报名号k(1000 ≤ k ≤ 9999)和该选手的笔试成绩s(1 ≤ s ≤ 100)。
数据保证选手的报名号各不相同。
ACM软件大赛之编程大赛题目(附部分答案)
ACM软件大赛之编程大赛比赛注意事项:●比赛时间为3小时(180分钟);比赛分两个阶段:第一阶段限时30分钟,完成公示的3题,第二阶段限时150分钟(事先完成第一阶段题目的小组可提前进入第二阶段);●比赛第一阶段的3道题目将在前期宣传中告知参赛选手,比赛第二阶段的题目将由赛事主席当场公布竞赛题目;●前两阶段题目分为三个分值(5分、10分、15分),第一阶段3道公示题都为5分;第二阶段总共15道题,根据不同的难度分值不同,分别为5道5分题,5道10分题,5道15分题;第一阶段参赛队员不可参考任何相关资料;第二阶段参赛队员可以携带诸如书,手册,程序清单等参考资料。
比赛过程中队员不得携带任何电子媒质的资料;参赛者可以选择自己擅长的语言(C,C++,JAVA等等)进行编写●考虑到大一和大二学生的知识掌握程度,大一参加选手一开始就会有10分的分数,最后总分是由所做题目及初始的10分相加得到。
●每组队员根据安排使用电脑,小组人数为两人的使用一台电脑,超过两人的使用两台电脑,每台的电脑配置完全相同;●各小组每做完一题或几题,必须交予评委老师运行,评委老师当场给分;●如在比赛中发现作弊等行为,将取消比赛资格。
第一阶段公示题目:题目一:(5分)打印以下图形,纵遵从字母顺序,行字符数遵从斐波那契数列ABCCDDDEEEEEFFFFFFFFGGGGGGGGGGGGG#include<iostream>int f(int x){int a = 1 , b = 0;int max_ = x;int sum = 0;for(int i = 0; i < max_ ; i++){sum = a + b;a = b;b = sum;}return sum;}void loop_print(int num,char chr){for(int i = 0; i < num ;i++)std::cout<<chr;std::cout<<"\n";}int main(){int line_max = 7;char chr = 'A';for(int line = 0; line < line_max; line++){loop_print(f(line+1),chr);chr++;}return 0;}题目二:(5分)有个电子钟,12点显示为12:00(即12小时制),那么请问一天24时间内,出现连续3个相同数字的钟点有几个?#include<iostream>using namespace std;bool check(int time){int h=time/100;int m=time-100*h;return h<=12&&m<=59&&h>0?true:false;//12小时制}int main(){int time=0;int j(0);//总计数器while(time<1270){//max 12:59int t=time;int n[4];for(int i=0;i<4;i++){n[i]=t%10;t /= 10;}if(n[1]==n[2]&&(n[0]==n[1]||n[3]==n[1])&&check(time)){//cout<<n[3]<<n[2]<<":"<<n[1]<<n[0]<<"\n";//testj++;}time++;}cout<<"total: "<<j*2<<endl;}题目三:(5分)10进制的四位数中有几个符合如下特征:将其分别表示为16进制、10进制、12进制,在每种状态下,分别将各个位上的数相加,能得到3个相等10进制数。
(完整word版)山东科技大学算法设计与分析试题
一、排序和查找是经常遇到的问题。
按照要求完成以下各题:(20分)(1) 对数组A={15,29,135,18,32,1,27,25,5},用快速排序方法将其排成递减序。
(2) 请描述递减数组进行二分搜索的基本思想,并给出非递归算法。
(3) 给出上述算法的递归算法.(4) 使用上述算法对(1)所得到的结果搜索如下元素,并给出搜索过程:18,31,135。
二、对于下图使用Dijkstra 算法求由顶点a 到顶点h 的最短路径。
(20分).三、 假设有7个物品,它们的重量和价值如下表所示。
若这些物品均不能被分割,且背包容量M =150,使用回溯方法求解此背包问题.请写出状态空间搜索树(20分)。
四、已知1()*()i i k k ij r r A a +=,k =1,2,3,4,5,6,r 1=5,r 2=10,r 3=3,r 4=12,r 5=5,r 6=50,r 7=6,求矩阵链积A 1×A 2×A 3×A 4×A 5×A 6的最佳求积顺序.(要求:给出计算步骤)(20分) 五、回答如下问题:(20分)(1) 什么是算法?算法的特征有哪些?(2) 什么是P 类问题?什么是NP 类问题?请描述集合覆盖问题的近似算法的基本思想。
一、排序和查找是常用的计算机算法.按照要求完成以下各题:(20分)(1) 对数组A={15,9,115,118,3,90,27,25,5},使用合并排序方法将其排成递减序。
(2) 若改变二分搜索法为三分搜索法,即从一个递减序列A 中寻找元素Z,先与元素[]3nA 比较,若[]3n Z A >,则在前面[]3n 个元素中寻找Z ;否则与2[]3nA 比较,总之使余下的序列为[]3n 个元素。
给出该方法的伪代码描述。
(3) 使用上述算法对(1)所得到的结果搜索如下元素,并给出搜索过程:118,31,25。
二、假设有7个物品,它们的重量和价值如下表所示。
ACM算法题以及答案
在做这些题目之前必须了解vector(数组),list(链表)、deque(双端队列)、queue(队列),priority_queue(优先队列)Stack(栈)、set(集合)、map(键值对),mutilset、mutilmap。
stack堆栈,没有迭代器,支持push()方法。后进先出,top()返回最顶端的元素,pop()剔除最顶元素
定义queue对象的示例代码如下:
queue<int> q1;
queue<double> q2;
queue的基本操作有:
入队,如例:q.push(x);将x接到队列的末端。
出队,如例:q.pop();弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
#include <vector>
vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:
using std::vector; vector<int> v;
或者连在一起,使用全名:
std::vector<int> v;
建议使用全局的命名域方式:
using namespace std;
list不支持随机访问。所以没有 at(pos)和operator[]。
list对象list1, list2 分别有元素list1(1,2,3),list2(4,5,6) 。list< int>::iterator it;
list成员
说明
constructor
构造函数
destructor
析构函数
ACM题目与答案—C
输入文件示例
10 2 41 2 10
输出文件示例
4
输入文件示例
10 2 41 73
输出文件示例
Fail
#include <iostream> #include <stdio.h> using namespace std; #define INF 1000000000 int dp[20002],M; int knapsack(int num,int value) { int i,t; for(i=M;i>=value;i--) { t = dp[i-value]+num; if(t<dp[i]) dp[i]=t; //用最小的dp值 } return 0; } int main() { int N,value,num,tempnum,temp; scanf("%d %d",&M,&N); for(int i=1;i<=M;i++) dp[i]=INF; dp[0]=0; while(N--) { scanf("%d %d",&value,&num); tempnum=1; temp=value; while(tempnum<=num) { knapsack(tempnum,temp); if(tempnum*2 <=num) { tempnum=tempnum<<1; temp=temp<<1;
}
} } if(dp[M]==INF) printf("Fail"); else printf("%d",dp[M]); return 0;
} else { tempnum = num-tempnum; if(tempnum!=0) { temp=tempnum * value; knapsack(tempnum,temp); } break; }
ACM程序设计试题及参考答案
ACM程序设计试题及参考答案猪的安家Andy和Mary养了很多猪。
他们想要给猪安家。
但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家。
举个例子,假如有16头猪,Andy建了3个猪圈,为了保证公平,剩下1头猪就没有地方安家了。
Mary生气了,骂Andy没有脑子,并让他重新建立猪圈。
这回Andy建造了5个猪圈,但是仍然有1头猪没有地方去,然后Andy又建造了7个猪圈,但是还有2头没有地方去。
Andy都快疯了。
你对这个事情感兴趣起来,你想通过Andy建造猪圈的过程,知道Andy家至少养了多少头猪。
输入输入包含多组测试数据。
每组数据第一行包含一个整数n (n <= 10) – Andy 建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示Andy建立了ai个猪圈,有bi头猪没有去处。
你可以假定(ai, aj) = 1.输出输出包含一个正整数,即为Andy家至少养猪的数目。
样例输入33 15 17 2样例输出16答案:// 猪的安家.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "iostream.h"void main(){int n;int s[10][2];bool r[10];char ch;cout<<"请输入次数:"<<endl;cin>>n;for (int i=0;i<n;i++){cout<<"请输入第"<<i+1<<"次的猪圈个数和剩下的猪:,用--分开,"<<endl;cin>>s[i][0]>>ch>>ch>>s[i][1];}for (i=0;i<10;i++)r[i]=true;for (int sum=1;;sum++){for (i=0;i<n;i++)r[i]=(sum%s[i][0]==s[i][1]);for (i=0;i<n;i++){if (r[i]==0)break;}if (i==n)break;}cout<<"猪至少有"<<sum<<"只。
山东科技大学OJ部分题目记答案
Problem A: Hello world! DescriptionXiao_ming有两个哥哥,大哥叫Da_min,二哥叫Er_min。
三兄弟放学回家,父母分别跟他们打招呼。
Input无Output请输出:Hello Da_min,Hello Er_min,Hello Xiao_ming!Sample InputSample OutputHello Da_min,Hello Er_min,Hello Xiao_ming!HINT请注意换行符#include <stdio.h>int main(){printf("Hello Da_min,\nHello Er_min,\nHello Xiao_ming!");}Problem A: 算术基本运算Description计算两整数x和y(0<x,y<1000)的和、差、积、商、余数、x的平方和y的三次方。
Input输入只有一行,格式见sample。
Output输出为多行,按顺序每行输出x,y的和、差、积、商、余数、x的平方和y的三次方,格式见sampleSample Inputx = 11, y = 3Sample Outputx + y : 14x - y : 8x * y : 33x / y quotient: 3, remainder: 2x ^ 2 : 121y ^ 3 : 27HINT注意输入输出格式。
了解C语言整数除法运算符的特点,并且没有求幂的运算符。
#include <stdio.h>int main(){int x,y;scanf ("x = %d, y = %d",&x,&y);printf ("x + y : %d\n",x+y);printf ("x - y : %d\n",x-y);printf ("x * y : %d\n",x*y);printf ("x / y quotient: %d, remainder: %d\n",x/y,x%y);printf("x ^ 2 : %d\n",x*x);printf ("y ^ 3 : %d\n",y*y*y);}Problem B: 求圆的面积和周长Description从键盘输入圆的半径,求圆的面积和周长,圆周率取3.14。
年度第二届全国大学生算法设计与编程挑战赛-正式赛
-2021年度第二届全国大学生算法设计与编程挑战赛正式赛目录•这是热身赛•o排列巨人o三子棋o钻石•这是正式赛• A - 塔• B - 日记• D - 质数区间• E - 神仙爱采药• F - 但更爱字符串•I - 奇怪的传输机增加了•J - 奇怪的小鸭子也增加了•K - 关于哥俩好这事•L - 我们未知的那窝蛋的名字(难)附上这些题目的链接这是热身赛排列巨人题目描述:有12个数字,分别是1~12。
计算并输出这12个数字的全排列的种类数。
解题思路:由题意知:题目实际要求1~12全排列的种类数。
由简单的数学知识我们知道:1~12的全排列的种类数为 12 ! package content;/*** Copyright (C), 2019-2021* author candy_chen* date 2021/3/1 17:10** @Classname test* Description: 算法竞赛:排列巨人*//****/public class Tester_01{public static void main(String[] args){int n = 12;int count = n * f(n - 1);System.out.print("对于12名巨人的排列方式有" + count +"种:" );int[] buf = {1,2,3,4,5,6,7,8,9,10,11,12};prem(buf,0,buf.length - 1);return;}private static void prem(int[] buf, int start, int end) {int count = 12;if(start==end){//输出排列好的数组System.out.print("{");for(int c:buf){System.out.print(c);if (count > 1){System.out.print(",");count--;}}System.out.print("}");System.out.print("、");}else{for(int i=start;i<=end;i++){int temp=buf[start];//前后元素交换buf[start]=buf[i];buf[i]=temp;prem(buf,start+1,end);//递归交换后面的元素temp=buf[start];buf[start]=buf[i];buf[i]=temp;}}}private static int f(int i) {int count = 1;if (i > 0){count = i * f(i - 1) ;}return count;}}三子棋解题思路:数据范围很小,可以O(S*T)枚举每一个位置的棋子。
第二届全国大学生算法设计与编程挑战赛(冬季赛)题解
第⼆届全国⼤学⽣算法设计与编程挑战赛(冬季赛)题解第⼆届全国⼤学⽣算法设计与编程挑战赛(冬季赛)只会做⽔题555 剩下的连题解也没看懂QAQ⽬录A 塔签到#include<iostream>using namespace std;int main(){char c1;int n=26; //设定塔的层数为26for(int i=1;i<=n;i++){ //对塔每⼀层按照规律进⾏构造。
//⾸先进⾏输出空格的操作:对于第i⾏,字符前⾯的空格个数为n-i个。
for(int j = 1;j<=n-i;j++)cout<<" ";for(int j=1;j<=i;j++){ //按照规律1,输出第1~第i个⼤写字母。
c1=j+'A'-1; //第j个⼤写字母为'A'+j-1cout<<c1; //输出第j个⼤写字母}for(int j=i-1;j>=1;j--){ //按照规律1,输出第i-1~第1个⼤写字母,注意是倒序c1=j+'A'-1;cout<<c1;}cout<<endl;//第i⾏输出结束,进⾏换⾏。
}return 0;}B ⽇记签到#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 5;typedef long long LL;string s;int main() {s = "ibti lbtlovebte lbtlibtinbtnkbtkebtezbas jebte dosadnbtna ""ovakbtkebtemibtijaxaszxdbtddbtddbtddbtddbtddbtd";string res;for (int i = 0; i < s.size(); i++) {res.push_back(s[i]);if (s[i] == 'l' || s[i] == 'i' || s[i] == 'n' || s[i] == 'k' ||s[i] == 'e') {i += 3;}}cout << res << endl;return 0;}C 哥布林待补...D 质数区间待补...E 神仙爱采药贪⼼即可,如果背包满了,那么遇到1就把2换掉,否则就⼀直往背包⾥放即可#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 5;typedef long long LL;#define int LLint v, num1, num2, res, now;string s;cin >> v;cin >> s;for (int i = 0; i < s.size(); i++) {if (s[i] == '1') {if (num1 + num2 * 2 < v) {num1++;now++;} else {if (num2) {num2--;num1++;}}} else {if (num1 + num2 * 2 + 2 <= v) {num2++;now++;}}res += now;}cout << res << endl;return 0;}F 但更爱字符串模拟...#include <bits/stdc++.h>using namespace std;typedef long long LL;int const MAXN = 2e5 + 10;int n, m, T;string s = "";string s0 = "";string t = "";string s1 = "";int main() {int len = 0;while (getline(cin, s0)) {int f = 0;int da = 0;int flag = 0;s0.push_back('\n');for (int i = 0; i < s0.size(); i++) {if ((s0[i] >= 'A' && s0[i] <= 'Z') ||(s0[i] >= 'a' && s0[i] <= 'z')) {s = s + s0[i];if (s0[i] >= 'A' && s0[i] <= 'Z') da++;continue;}if (s[0] >= 'a' && s[0] <= 'z' || da > 1 || s.size() <= 1) { if (len <= 1) {f = 1;cout << s1;if (len == 1) cout << " ";t = "";s1 = "";len = 0;} else {f = 1;cout << t;cout << " (" << s1 << ") ";t = "";s1 = "";len = 0;}cout << s;} else {if (s0[i] == ' ') {if (s0[i - 1] == ',' || s0[i - 1] == '.' ||s0[i - 1] == '!') {cout << " ";continue;}t = t + s[0];if (len >= 1) s1 += " ";s1 = s1 + s;len++;f = 0;} else {if (len < 1) {f = 1;cout << s1;if (len == 1) cout << " ";s1 = "";len = 0;cout << s;} else {f = 1;t = t + s[0];cout << t;if (s != "," || s != ".") s1 = s1 + " " + s;cout << " (";cout << s1;cout << ")";t = "";s1 = "";len = 0;}}}if (f) cout << s0[i];if (s0[i] >='a'&&s0[i] <='z'||s0[i] >='A'&&s0[i] <='Z')f = 1;s = "";da = 0;}}return 0;}贴个标程吧,感觉标程写的很清晰:#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<vector>using namespace std;vector <string> word;//存放单词和符号bool bigletter(char c){//判断是不是⼤写字母if(c>='A'&&c<='Z') return true;return false;}bool smallletter(char c){//判断是不是⼩写字母if (c>='a'&&c<='z') return true;return false;}bool bigletterword(string s){//判断是不是wordif (!bigletter(s[0])) return false;if (s.size()<=1) return false;for (int i=1;i<s.size();i++){if (!smallletter(s[i])) return false;}return true;}void work(){//处理每⼀个单词或符号int n=word.size();for (int i=0;i<n;i++){int inow=i;if (!bigletterword(word[i]))//如果不需要缩写则直接输出cout<<word[i];if (bigletterword(word[i])) {if (i!=n-1){//最后⼀位要么跟着前⾯的缩写,要么就是只有⼀个符合的所以不⽤缩写 if (word[i+1]==" "&&bigletterword(word[i+2])){int j;for (j=i;j<n;j++){if ((j-i)%2==0){if (!bigletterword(word[j])){j--;break;}else cout<<word[j][0];}else if (word[j]!=" ") break;}//j停在了最后符合要求的word的最后⼀位的后⾯⼀位cout<<" (";for (int k=i;k<j-1;k+=2)cout<<word[k]<<' ';cout<<word[j-1]<<')';inow=j-1;//i直接跳过缩写的部分}else cout<<word[i];}else cout<<word[i];}i=inow;}int main(){string s;while(getline(cin,s)){if (s.size()==0) break;//如果输⼊为空就停⽌string w="";//存放单词for (int i=0;i<s.size();i++){//循环sif (bigletter(s[i])||smallletter(s[i])) w+=s[i];//如果是字母则直接压到s⾥if (!bigletter(s[i])&&!smallletter(s[i])){//否则把单词压到word了,并把符号也压进去 word.push_back(w);w="";w+=s[i];word.push_back(w);w="";}}word.push_back(w);//把最后⼀个单词压进去work();word.clear();//清空wordcout<<endl;}return 0;//完美结束}G 猫腥草争夺⼤战状压DP,待补...H ⽆限⼭河印的故事倍增+字符串hash 待补...I 奇怪的传输机增加了模拟每⼀天的状态即可#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 5;typedef long long LL;double n, now;int x, y;const double eps = 1e-8;// 和0做⽐较int sgn(double x) {if (fabs(x) < eps) return 0; // =0if (x < 0)return -1; // < 0elsereturn 1; // > 0}int main() {cin >> n >> x >> y;now = n;for (int i = 1; i <= y; i++) {now = 2.0 * now / 3.0;if (i >= x) {now = min(n, now + (n / 2));x = 1e5;}if(sgn(now-n/32)<0){cout << "N0!" << endl;printf("%d %.6lf\n", i, now);return 0;}}cout << "YE5!" << endl;printf("%.6lf\n", now);return 0;}J 奇怪的⼩鸭⼦也增加了数学题#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 5;typedef long long LL;int main(){cin >> A >> B >> a >> b;int x = (A - a) / a / 2 + 1;int y = (B - b) / b / 2 + 1;cout << x * y << endl;return 0;}K 关于哥俩好的数字这件事暴⼒枚举数位和#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 5;typedef long long LL;#define int LLvector<int> res[N];int get(int x) {int res = 0;while (x) {res += x % 10;x /= 10;}return res;}signed main() {for (int i = 1; i <= 1e7; i++) {res[get(i)].push_back(i);}int n;cin >> n;if(n==1)cout << 1 << endl;else if (n <= 10) {LL ress = 0;for (int i = 0; i < n; i++) {ress += res[n - 1][i];}cout << ress << endl;} else if (n >= 11) {LL ress = 1e18;for (int j = 9; j <= 20;j++){LL tmp = 0;for (int i = 0; i < n; i++) tmp += res[j][i];ress = min(ress, tmp);}cout << ress << endl;}return 0;}L 我们仍未知道那窝蛋的名字待补...M 出题⼈说这道题是⼀个签到题签到#include <bits/stdc++.h>using namespace std;int n;signed main() {cin >> n;if (n == 1)cout << "ADPC";elsecout << "12345";return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
山东科技大学第二届ACM程序设计大赛试题册试题共14页,题目共计12道山东科技大学第二届ACM 程序设计大赛试题册Problem A 简单计算Description给出n 个十进制的数,找出这n 个数的二进制表示中1的个数最少的数。
Input输入的第一行为一个正整数T (1≤T ≤20),代表测试数据组数。
对于每组测试数据,输入的第一行为一个正整数n (1≤n ≤10000),第二行为n个正整数A 1、A 2、…、A n (1≤A i ≤109),每个数之间以空格分隔。
Output每组数据输出一行,先输出数据组数,再输出二进制中含1最少的数,如果存在多个数符合条件,输出最小的那个。
具体输出格式见样例输出。
Sample Input Sample Output山东科技大学第二届ACM 程序设计大赛试题册Problem B 关键字搜索Description我们的新网站具有了全新的搜索功能,使用了2个通配符“*”和“?”,其中“*”表示0或者多个小写字母,“?”代表1个字母。
当我们输入一个关键字的时候,我们在不确定的地方就使用通配符。
我们在数据库里面有多条记录,每条记录都是由小写字母组成,现在给出一个关键字,你能告诉我数据库里面有多少条与关键字相匹配的记录吗?例如: 如果关键字是j*y*m*y?,那么jiyanmoyu ,jyanmoyu ,jymyu 都是相匹配的记录。
Input第一行输入一个T (T ≤20),表示有T 组测试数据。
对于每组测试数据,第一行是输入的关键字,接下是数据库里面的所有记录的条数n ,1≤n ≤10000,每条记录的长度不超过50个小写字母。
Output对于每组测试数据,输出与关键字相匹配的总记录条数,占一行。
Sample Input Sample Output山东科技大学第二届ACM 程序设计大赛试题册Problem C 正方形Description在二维坐标轴内给出四个点,这四个点能否构成一个正方形。
Input第一行包括一个整数:T (1≤T ≤30),表明有T 组测试数据。
下面各行有8个整数:x 1,y 1,x 2,y 2,x 3,y 3,x 4,y 4(数据均在-1000,1000之间),以逆时针顺序给出四个点的坐标。
Output对每个样例,如果是正方形,则单独在一行内输出YES ,否则,输出NO 。
Sample Input Sample Output山东科技大学第二届ACM 程序设计大赛试题册Problem D 切蛋糕Description今年是ACM 集训队成立五周年,这是一个值得祝福的事情。
我们该送给ACM 集训队一个怎样的礼物呢?对于目前的大家来说,最好的礼物当然是省赛中的好成绩,我不能参赛,就送给学校一个DOOM III 球形大蛋糕吧,这可是名牌,估计要花掉我半年的银子呢。
切蛋糕的人,当然非吴教主莫属。
等一等,吃蛋糕之前先考大家一个问题:如果吴教主在蛋糕上切了N 刀(教主刀法极好,每一刀都是一个绝对的平面),最多可以把这个球形蛋糕切成几块呢? 做不出这个题目,没有蛋糕吃的!Input第一行输出一个T (T ≤100),表示有T 组。
每组包含一个整数N (1≤N ≤1000),表示切的刀数。
Output对于每组输入数据,请输出对应的蛋糕块数,每个测试实例输出一行。
Sample Input Sample Output山东科技大学第二届ACM程序设计大赛试题册Problem E 画笑脸Description用C语言画些任意大小的笑脸来。
画法见Sample。
InputT组数据,每组数据只有一个数N(1≤T≤20,1≤N≤20),表示笑脸的边长大小。
Output把笑脸画出来吧。
注意:不要任何多余的空格和空行,每两组数据间输出一个空行。
Sample Input3123Sample Output山东科技大学第二届ACM 程序设计大赛试题册Problem F 猜数字Description小X 最近发明了一种新游戏,他找来一堆卡片,每张卡片上都写有一个四位数,然后由两个人来玩。
玩家A 每次从这堆卡片中选择一张,然后由玩家B 告诉玩家A 他猜的数字中有几个与卡片中的相同,有几个与卡片中的位置相同。
例如,玩家A 抽到的卡片是1122。
如果玩家A 猜1234,因为1,2这两个数字同时存在于这两个数中,而且1在这两个数中的位置是相同的,所以玩家B 会告诉玩家A 猜对了2个数字,其中一个在正确的位置。
如果玩家A 猜1111,那么玩家B 会告诉他猜对2个数字,有2个在正确的位置。
现在给你一段游戏过程,你的任务是根据这过程来判断能否确定卡片上的四位数是什么。
Input输入数据有多组。
每组的第一行为一个正整数N (1≤N ≤100),表示共有N 次游戏过程。
在接下来的N 行中,每行三个整数x, y, z 。
玩家A 猜这个四位数为x ,然后玩家B 回答猜对了y 个数字,其中z 个在正确的位置上。
当N=0时,输入数据结束。
Output每组输入数据对应一行输出。
如果根据这段对话能确定这个四位数,则输出”Y es”,若不能,则输出"Not sure"。
Sample Input Sample Output山东科技大学第二届ACM程序设计大赛试题册山东科技大学第二届ACM 程序设计大赛试题册Problem G 排火柴Description小X 有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度。
现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:,其中a i 表示第一列火柴中第i 个火柴的高度,b i 表示第二列火柴中第i 个火柴的高度。
每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。
请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,997 取模的结果。
Input多组测试数据。
第一行输入一个数T (T ≤20),表示测试数据组数。
对于每组测试数据输入共三行。
第一行包含一个整数 n ,表示每盒中火柴的数目。
第二行有n 个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。
第三行有n 个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。
数据范围:1≤n ≤100,000,0≤火柴高度≤231-1。
Output每组测试数据输出一行,每行包含一个整数,表示最少交换次数对99,999,997取模的结果。
Sample Input Sample Output山东科技大学第二届ACM 程序设计大赛试题册Problem H 原创字符串Description我们称一个字符串s 为“原创”当且仅当s 不是N 个字符串中的任意一个字符串的子串(子串:串中任意个连续字符组成的子序列)。
现在有N 个只包含小写字母的字符串,你的任务是根据给出的N 个字符串构造一个长度最小的“原创”字符串,如果存在多个长度最小的则输出字典序最小的那个。
Input对于每组测试数据,输入的第一行为一个正整数n (1≤n ≤30)代表给定字符串的大小,接下来N 行每行一个非空只包含小写字母的字符串,每个字符串长度不超过20。
输入以一行0结束。
Output输出符合要求的字符串,每组答案占一行。
Sample Input Sample Output山东科技大学第二届ACM 程序设计大赛试题册Problem I IP 的计算Description在网络课程上,我们学到了很多有关IP 的知识。
IP 全称叫网际协议,有时我们又用IP 来指代我们的IP 网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP 地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现),如192.168.100.16,是我们非常熟悉的IP 地址,一个IP 地址串中没有空格出现(因为要表示成一个32位数字)。
但是粗心的我,常常将IP 地址写错,现在需要你用程序来判断。
Input输入有T (T ≤20)组,每组有一行,不超过100个字符。
Output对于每组输出一行,判断输入的IP 是否正确,如果正确输出YES ,否则NO 。
Sample Input Sample Output山东科技大学第二届ACM程序设计大赛试题册Problem J 美味的蛋糕Description图1的蛋糕. 它是由5*5的小方格组成的。
图 1 图 2每个小方格都是1*1的大小,小方格上有星号表示在上面放了草莓。
现在,问题来了。
你是否可以将蛋糕分成小的正方形区域每一个区域上都正好有一个草莓。
一个可行的划分如图2所示。
Input多组测试数据。
输入第一行一个数T≤20,表示测试数据组数。
每组样例的第一行包含两个整数L(0<L<20)和N(N>0),它代表了蛋糕的大小是L*L,蛋糕上有N个草莓。
在此之后,有N行。
每一行包含两个整数x i和y i,这表示在(x i, y i)有草莓。
可以认为在同一个小方格上放置的草莓数不会超过1,这些整数之间可能有一个或多个空格。
Output如果你能找到一个可行的划分输出“YES”,否则输出“NO”。
Sample Input Sample Output山东科技大学第二届ACM 程序设计大赛试题册山东科技大学第二届ACM程序设计大赛试题册Problem K 藏头诗DescriptionACM集训队有个小伙暗恋同班的姑娘,但是苦于害羞腼腆不敢直抒胸臆。
于是小伙打算写一首英文情诗给她。
为了使这首情诗高端霸气上档次,小伙经过三天三夜的精心创作写了一首藏头的情诗。
请问你能看出他想要表达的真正内容吗?Input输入有T组(T≤20)。
每组数据第一行先输入一个整数N(N<100),表示下面要输入N行。
接下来N行,每行输入一段英文(长度小于100,只含大小写英文字母和空格)。
Output每组输出一行,为藏头诗要表达的真正内容。
Sample Input18I am a handsome manlonely and long for you attentionof all the girls I met you gave me the deepest impression Very lucky to know youearn money to make you happyyou are the worldoh be ma sideu are the happiest person in the worldSample OutputIloVeyou山东科技大学第二届ACM 程序设计大赛试题册Problem L 植树Description杰哥所在的公司业余活动很丰富,经常举行一些竞赛,游戏和其他活动,公司定期组织打乒乓球,篮球,爬山,真人cs 等等。