ACM程序设计题1
ACM 1
ACM程序设计大赛ACM程序设计大赛是大学级别最高的脑力竞赛,素来被冠以"程序设计的奥林匹克"的尊称。
大赛自1970年开始至今已有30年历史,是世界范围内历史最悠久、规模最大的程序设计竞赛。
比赛形式是:经过校级和地区级选拔的参赛组,于指定的时间、地点参加世界级的决赛,由3个成员组成的小组应用一台计算机解决6到8个生活中的实际问题。
比赛目的比赛参赛队员必须在5小时内编完程序并进行测试和调试。
此种大赛对参赛学生的逻辑分析能力、策略制定和脑力方面具有极大的挑战性。
大赛提倡在压力较大的情况下,培养学生的创造力、团队合作精神以解决竞赛的问题,从而挑选和发掘世界上最优秀的程序设计人才。
历史竞赛的历史可以上溯到1970年,当时在美国德克萨斯A&M大学举办了首届比赛。
当时的主办方是the Alpha Chapter of the UPE Computer Science Honor Society。
作为一种全新的发现和培养计算机科学顶尖学生的方式,竞赛很快得到美国和加拿大各大学的积极响应。
1977年,在ACM计算机科学会议期间举办了首次总决赛,并演变成为目前的一年一届的多国参与的国际性比赛。
迄今已经举办了29届。
最初几届比赛的参赛队伍主要来自美国和加拿大,后来逐渐发展成为一项世界范围内的竞赛。
特别是自1997年IBM开始赞助赛事之后,赛事规模增长迅速。
1997年,总共有来自560所大学的840支队伍参加比赛。
而到了2004年,这一数字迅速增加到840所大学的4109支队伍并以每年10-20%的速度在增长。
1980年代,ACM将竞赛的总部设在位于美国德克萨斯州的贝勒大学。
在赛事的早期,冠军多为美国和加拿大的大学获得。
而进入1990年代后期以来,俄罗斯和其它一些东欧国家的大学连夺数次冠军。
来自中国大陆的上海交通大学代表队则在2002年美国夏威夷第26届和2005年上海举行的第29届全球总决赛上两夺冠军。
acm程序设计教程 course(1)初识ACM
2011-9-5
38
2009-6-9 讨论湖南省大学生计算机程 序设计竞赛湖南师范大学具体实施方案 2009-6-10 下发2009年湖南省大学生计 算机程序设计竞赛湖南师范大学选拔赛 通知(数计院、物信院、工学院) 2009-6-15 正式选拔 2009-7-4 开学典礼 7-10——8-10 暑假集训
2011-9-5
6
ACM/ICPC in China
中国大陆高校从1996年开始参加ACM/ICPC—— 前六届中国赛区设在上海,由上海大学承办; 2002年由清华大学和西安交通大学承办; 2003年由清华大学和中山大学承办。 2004年由北京大学和上海交通大学承办。 2005年由四川大学、北大和浙大承办。 2006年由上海大学、清华和西电承办。 2007年:北航、南航、吉大、西华 2008年:哈工程、北交、合肥、杭电、西南民大
35
2011-9-5
今年比赛
2011(9.14-9.15) 湖南农业大学
2011-9-5
36
第三部分
我校ACM相关情况
2011-9-5 37
组建过程
Байду номын сангаас
2009-5-7 ACM/ICPC华中南区程序设 计大赛选拔考试(小范围,数计学院) 2009-5-8 组队报名、竞赛介绍、简单 培训 5月29日至5月31日 参加ACM/ICPC华 中南区程序设计大赛(湖南大学)
参赛队组成
ACM-ICPC以团队的形式代表各学校参赛, 每个 赛区的优胜队伍将获得参加ACM国际大学生程序 设计竞赛全球总决赛资格。 亚洲区的高校可以组队参加亚洲的任何一个或者 几个赛区的比赛,但每所高校最多只能有一队可 以获得参加全球世界决赛的资格。 每队由一名教练和三名队员组成, 有些赛区还允许 有一名候补队员。 亚洲区的每位参赛选手在一年内最多可参加两个 赛区的亚洲区预选赛, 每位选手最多可以参加五届 亚洲区预选赛和两届全球总决赛。
大学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程序 循环题目
acm程序循环题目
以下是两道常见的 ACM 循环题目:
1. 水桶挑战赛:一个 n 个人组成的队伍在 m 个水桶中轮流取水,每个人只能取一个水桶的水,且每个水桶的水量不同。
要求每个人取水的总时间不超过 t 分钟。
求出每个人取水的最优策略。
2. 循环赛日程表:给定 n 个队伍,需要安排一场循环赛,每个队伍都要与
其他所有队伍进行一场比赛,并且每个队伍只进行一场比赛。
要求找出一种最优的比赛日程表,使得每个队伍等待的时间最短。
这两道题目都是经典的 ACM 循环题目,考察的是循环和动态规划的思想。
在解决这类问题时,需要注意循环的起点和终点,以及循环中每个状态的含义和转移方程。
同时,还需要注意状态压缩和记忆化搜索等优化技巧的使用。
exercise1_ACM
第一次作业1、平面分割方法设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
输入示例:3输出示例:8要求:用两种方法:(1)得到第n项与其之前已知项之间的关系,程序用递归实现(2)得到第n项的通项公式,程序直接实现。
解:每增加一条封闭曲线该曲线就会与之前的每条曲线产生两个交点,所以会增加2(n-1)个交点。
(1)递归关系:f(n)=f(n-1)+2(n-1)(增加几个交点就增加几个平面),f(1)=2 (2)通项公式:f(n)=n(n-1)+2//(1)//平面分割方法int countArea(int n)//递归法{if(n==1)return 2;elsereturn countArea(n-1)+2*(n-1);}//通项公式法an=2+n(n-1)int countArea2(int n){return 2+n*(n-1);}2、LELE的RPG难题有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.输入示例:3输出示例:6解:递归分析:从f(n-1)增加到f(n)分两种情况:(1)一种是直接在所有已经排好了的f(n-1)序列中插入唯一一个第三色有f(n-1)种;(2)另外是在已经排好了的f(n-2)序列中,插入与缝隙两边其中一个颜色相同的颜色,然后再插入第n个颜色且只需与第n-1种颜色不同有两种,故有2f(n-2)种;递归关系:f(n)=f(n-1)+2f(n-2),(n>=2)//(2)LELE的RPG难题int countColor(int n){if(n==2)return 6;else if(n==3)return 6;elsereturn countColor(n-1)+*countColor(n-2);}3、假设一个有序数组A[0], A[1], …, A[N-1],编写一个函数int find(int A[], int x),确定一个整数x是否在数组A中,如果在,则返回其位置,否则返回-1//有序数组元素查找-二分查找int find(int A[],int n){//sizeof(A)sizeof写进函数得不到数组所占的内存数,而仅是一个指针的内存大小 int length=0;//参数数组长度for(int i=0;A[i]!=0;i++){length++;}int left=0,mid,right=length-1;while(left<=right){mid=(left+right)/2;if(n<A[mid])right=mid-1;else if(n>A[mid]){left=mid+1;}elsereturn mid;}return -1;}4、假设数组a中的元素是按从小到大顺序排列的,函数find(int a[], int n, int &i, int &j, int x)利用二分搜索法确定x是否在含有n个元素的数组a中,如果不在,则参数i为小于x的最大元素的下标,参数j为大于x的最小元素的下标。
2.简单计算题(一)
2/38
最小公倍数
• /ShowProblem.aspx ?ShowID=1178 • /showproblem.php? pid=1108
3/38
• Problem Description 求两个正整数的最小公倍数。 • Input 输入数据含有不多于50对的数据,每对数据 由两个正整数(0<n1,n2<100000)组成。 • Output 对于每组数据n1和n1,计算最小公倍数,每 个计算结果应占单独一行。
8/38
POJ 2750 鸡兔同笼
• /problem?id=2750
9/38
• Problem Description
一个笼子里面关了鸡和兔子(鸡有2只脚,兔子有4只脚,没有 例外)。已经知道了笼子里面脚的总数a,问笼子里面至少有多 少只动物,至多有多少只动物。
ACM算法与程序设计
第二讲
简单计算题(一)
简单计算题
• 主要目的:通过编写一些简单计算题的程 序.焘悉C/C++语言的基本语法. • 基本思想:解决简单的计算问题的基本过程包 括将一个用自然语言描述的实际问题抽象成一 个计算问题.给出计算过程.继而编程实现计 算过程,并将计算结果还原成对原来问题的解 答。这里首要的是读懂问题.接清输入和输出 数据的含义及给出的格式· 并且通过输入输出样 例验证自己的理解是否正确。
} return x;
}
7/38
#include<iostream.h> int gcd(int int) ; Int main() { int x,y; while(cin>>x>>y) { cout<<x*y/gcd(x,y)<<end1; cout<<x/gcd(x,y)*y<<end1; } return 0; } int gcd(int a,int b){return !b?a:gcd(b,a%b);}
北大ACM题型
3.C[i,j]=w[i,j]+opt{C[i,k-1]+C[k,j]}.(最优二分检索树问题)
六.数学
(1)组合数学:
1.加法原理和乘法原理.
2.排列组合.
3.递推关系. (POJ3252,poj1850,poj1019,poj1942)
(2)数论.
1.素数与整除问题
(2)扫描线算法(例如求矩形的面积和周长并,常和线段树或堆一起使用). (poj1765,poj1177,poj1151,poj3277,poj2280,poj3004)
(3)多边形的内核(半平面交)(poj3130,poj3335)
(4)几何工具的综合应用.(poj1819,poj1066,poj2043,poj3227,poj2165,poj3429)
(2)记录状态的动态规划. (POJ3254,poj2411,poj1185)
(3)树型动态规划(poj2057,poj1947,poj2486,poj3140)
六.数学
(1)组合数学:
1.容斥原理.
2.抽屉原理.
3.置换群与Polya定理(poj1286,poj2409,poj3270,poj1026).
五.动态规划
(1)需要用数据结构优化的动态规划. (poj2754,poj3378,poj3017)
(2)四边形不等式理论.
(3)较难的状态DP(poj3133)
六.数学
(1)组合数学.
1.MoBius反演(poj2888,poj2154)
2.偏序关系理论.
(2)博奕论.
----------------------------------------------------------------------------------------------- -----------------------------------补充 Dp状态设计与方程总结
acm构造题
acm构造题
当谈到构造题时,有许多不同类型的ACM构造问题。
以下是一些常见的ACM构造题目类型和解决方法:
1.排列组合构造:这类问题通常要求你构造一个满足某种条件的排列或组合。
解决这类问题的关键是理解条件并找到一种满足条件的构造方法。
可以使用递归、迭代或其他数学技巧来解决这类问题。
2.图论构造:这类问题涉及到构建满足某些图论性质的图。
常见的图论构造问题包括树的构造、连通图的构造、二分图的构造等。
解决这类问题通常需要理解图论的基本概念和性质,并使用合适的算法进行构造。
3.数据结构构造:这类问题要求你构造一个满足某种数据结构性质的数据结构。
例如,构造一个满足平衡二叉搜索树性质的树,或者构造一个满足堆性质的数组。
解决这类问题通常需要对特定数据结构的性质和操作进行了解,并设计相应的构造方法。
4.数学构造:这类问题要求你构造一个满足某种数学性质的对象。
例如,构造一组满足特定方程的整数,或者构造一种满足特定性质的数列。
解决这类问题通常需要运用数学知识和技巧,并找到合适的构造方法。
对于ACM构造题目,关键是理解问题的要求和条件,并设计一个满足条件的构造方法。
可以根据问题的性质选择适当的算法、数据结构或数学技巧来解决问题。
在解题过程中,需要注意时间复杂度和空间复杂度的控制,以确保算法的效率和正
确性。
另外,多进行思维训练和练习,熟悉不同类型的构造问题,能够提高解决问题的能力。
acm程序设计大赛试题
acm程序设计大赛试题ACM程序设计大赛试题是计算机科学领域中的一项重要竞赛活动,旨在选拔和培养具有优秀编程能力和创新思维的学生。
这项比赛既考察参赛选手解决实际问题的能力,又对他们的编程技巧、算法设计和计算机知识有着较高的要求。
本文将介绍ACM程序设计大赛试题的特点和题目类型。
一、ACM程序设计大赛试题的特点ACM程序设计大赛试题具有以下几个特点:1. 实际问题背景:ACM程序设计大赛试题往往以实际问题为基础,模拟真实世界中的场景,让选手能够将所学知识应用到实际中去。
2. 多样性:ACM程序设计大赛试题涵盖了多个领域的问题,如图论、动态规划、贪心算法等,选手需要具备广泛的知识储备和灵活的思维方式。
3. 时间限制:ACM程序设计大赛试题通常要求选手在有限的时间内解决问题,这既考验了选手对问题的理解能力,也考察了他们的编程速度和应变能力。
二、ACM程序设计大赛试题的题目类型ACM程序设计大赛试题的题目类型多种多样,以下是其中几个常见的类型:1. 编程题:选手需要根据题目要求,设计算法并编写代码解决问题。
这类题目旨在考察选手的编程能力和算法设计思维。
2. 选择题:选手需要在给定的选项中选择正确答案,这类题目常常涉及到基础的计算机知识和数据结构。
3. 填空题:选手需要根据题目要求,在给定的空格中填入适当的代码或数值,这类题目考察选手对编程语言和计算机原理的理解程度。
4. 简答题:选手需要对给定问题进行理论分析,并进行文字解释或证明,这类题目考察选手的理解能力和表达能力。
三、ACM程序设计大赛试题的难度ACM程序设计大赛试题的难度各有不同,通常分为初级、中级和高级三个层次,以满足不同年级和专业背景的选手需求。
初级试题注重基础知识和算法简单实现,中级试题涉及到较为复杂的数据结构和算法设计,高级试题则对选手的编程能力和创新思维提出更高要求。
四、参加ACM程序设计大赛的意义参加ACM程序设计大赛对学生有着重要的意义:1. 锻炼编程能力:参加ACM程序设计大赛能够提升选手的编程技巧和实际问题解决能力。
杭电OJ:1089----1096(c++)(ACM入门第一步:所有的输入输出格式)
杭电OJ:1089----1096(c++)(ACM⼊门第⼀步:所有的输⼊输出格式)1089:输⼊输出练习的A + B(I)问题描述您的任务是计算a + b。
太容易了?!当然!我专门为ACM初学者设计了这个问题。
您⼀定已经发现某些问题与此标题具有相同的名称,是的,所有这些问题都是出于相同的⽬的⽽设计的。
输⼊项输⼊将由⼀系列由空格隔开的整数对a和b组成,每⾏⼀对整数。
输出量对于每对输⼊整数a和b,应该在⼀⾏中输出a和b的总和,并且在输⼊中每⾏输出⼀⾏。
样本输⼊1 5 10 20样本输出6 30题解:#include<cstdio>#include<iostream>using namespace std;int main(){int a, b,sum;while(cin >> a >> b){sum = a+b;cout << sum << endl;}return 0;}1090:投⼊产出练习的A + B(II)问题描述您的任务是计算a + b。
输⼊项输⼊的第⼀⾏包含⼀个整数N,然后是N⾏。
每⾏由⼀对整数a和b组成,每对之间⽤空格隔开,每⾏⼀对整数。
输出量对于每对输⼊整数a和b,应该在⼀⾏中输出a和b的总和,并且在输⼊中每⾏输出⼀⾏。
样本输⼊2 1 5 10 20样本输出6 30题解:#include<cstdio>#include<iostream>using namespace std;int a,b,n,sum;cin >> n;while (n){cin >> a >> b;sum = a + b;cout << sum << endl;n--;}return 0;}1091:投⼊产出练习的A + B(III)问题描述您的任务是计算a + b。
acm基础试题及答案
acm基础试题及答案1. 题目:给定一个整数数组,请找出数组中第二大的数。
答案:我们可以使用排序的方法,将数组从小到大排序,然后数组中的倒数第二个数就是第二大的数。
或者使用一次遍历的方法,首先初始化两个变量,一个用来存储最大值,一个用来存储第二大的值。
遍历数组,每次比较当前元素与最大值,如果当前元素大于最大值,则更新第二大的值为最大值,并将当前元素赋给最大值;如果当前元素小于最大值但大于第二大的值,则更新第二大的值。
2. 题目:实现一个函数,计算一个字符串中字符出现的次数。
答案:可以使用哈希表来实现,遍历字符串中的每个字符,将其作为键值对存储在哈希表中,键是字符,值是该字符出现的次数。
遍历结束后,哈希表中存储的就是每个字符出现的次数。
3. 题目:给定一个链表,删除链表的倒数第n个节点,并且返回新的链表头节点。
答案:可以使用双指针的方法,首先初始化两个指针,都指向链表的头节点。
然后移动第一个指针,移动n步,此时第一个指针指向倒数第n个节点的前一个节点。
接着同时移动两个指针,直到第一个指针到达链表的末尾,此时第二个指针指向的节点就是需要删除的节点的前一个节点。
然后更新第二个指针的next指针,使其指向第二个指针的next节点的next节点,最后返回链表的头节点。
4. 题目:编写一个函数,判断一个整数是否是回文数。
回文数是指正序和倒序读都一样的数。
答案:首先将整数转换为字符串,然后使用双指针的方法,一个指针从字符串的开始位置,一个指针从字符串的结束位置,向中间移动。
如果两个指针指向的字符不相等,则该整数不是回文数。
如果遍历结束后没有发现不相等的字符,则该整数是回文数。
5. 题目:给定一个字符串,找出其中不含有重复字符的最长子串的长度。
答案:可以使用滑动窗口的方法,维护一个哈希表记录窗口内字符的出现情况,以及一个变量记录不含有重复字符的最长子串的长度。
遍历字符串,每次移动窗口的右端点,如果当前字符不在窗口内,则更新最长子串的长度,并将字符添加到哈希表中。
ACM程序设计竞赛例题[1]
备战ACM资料习题1.0-1背包问题在0 / 1背包问题中,需对容量为c 的背包进行装载。
从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。
对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
程序如下:#include <stdio.h>void readdata();void search(int);void checkmax();void printresult();int c=35, n=10; //c:背包容量;n:物品数int w[10], v[10]; //w[i]、v[i]:第i件物品的重量和价值int a[10], max; //a数组存放当前解各物品选取情况;max:记录最大价值//a[i]=0表示不选第i件物品,a[i]=1表示选第i件物品int main(){readdata(); //读入数据search(0); //递归搜索printresult();}void search(int m){if(m>=n)checkmax(); //检查当前解是否是可行解,若是则把它的价值与max比较{a[m]=0; //不选第m件物品search(m+1); //递归搜索下一件物品a[m]=1; //不选第m件物品search(m+1); //递归搜索下一件物品}}void checkmax(){int i, weight=0, value=0;for(i=0;i<n;i++){if(a[i]==1) //如果选取了该物品{weight = weight + w[i]; //累加重量value = value + v[i]; //累加价值}}if(weight<=c) //若为可行解if(value>max) //且价值大于max max=value; //替换max}void readdata(){for(i=0;i<n;i++)scanf("%d%d",&w[i],&v[i]); //读入第i件物品重量和价值}void printresult(){printf("%d",max);}2.装载问题有两艘船,载重量分别是c1、c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。
ACM程序设计竞赛例题[1]
A C M程序设计竞赛例题[1]-CAL-FENGHAI.-(YICAI)-Company One1备战ACM资料习题1.0-1背包问题在0 / 1背包问题中,需对容量为c 的背包进行装载。
从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。
对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。
程序如下:#include <>void readdata();void search(int);void checkmax();void printresult();int c=35, n=10; ");printf("\n");}printf("\n");}6.素数环问题把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数。
分析:用回溯算法,考察所有可能的排列。
程序如下:#include <>#include <>void search(int);void init(); 表示空格;’X’表示墙。
程序如下:#include <>#include <>void search(int,int);int canplace(int,int);void readdata(); Floodfill给一个20×20的迷宫和一个起点坐标,用广度优先搜索填充所有的可到达的格子。
提示:参考第2题。
2. 电子老鼠闯迷宫如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路本题给出完整的程序和一组测试数据。
状态:老鼠所在的行、列。
程序如下:#include<>void readdata();a[i][j]=0; ....注:测试数据可在运行时粘贴上去(点击窗口最左上角按钮,在菜单中选则“编辑”/“粘贴”即可)。
acm大学生程序试题及答案
acm大学生程序试题及答案1. 题目:字符串反转描述:给定一个字符串,编写一个函数来将字符串中的字符按相反的顺序重新排列。
输入:一个字符串输出:反转后的字符串答案:```pythondef reverse_string(s):return s[::-1]```2. 题目:寻找最大数描述:给定一个整数数组,找出数组中的最大数。
输入:一个整数数组输出:数组中的最大数答案:```pythondef find_max(nums):return max(nums)```3. 题目:两数之和描述:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数的索引(从1开始计数)。
输入:一个整数数组和一个目标值输出:两个数的索引,如果没有则返回空数组答案:```pythondef two_sum(nums, target):num_to_index = {}for i, num in enumerate(nums):complement = target - numif complement in num_to_index:return [num_to_index[complement] + 1, i + 1] num_to_index[num] = ireturn []```4. 题目:无重复字符的最长子串描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。
输入:一个字符串输出:最长子串的长度答案:```pythondef length_of_longest_substring(s):char_map = {}start = max_length = 0for end in range(len(s)):if s[end] in char_map:start = max(start, char_map[s[end]] + 1)char_map[s[end]] = endmax_length = max(max_length, end - start + 1)return max_length```5. 题目:整数转罗马数字描述:将一个整数转换为罗马数字。
pkuacm_summar1
例题4:POJ1679 The Unique MST
题目:要求判断给定图的最小生成树是否唯一
解:显然,这是一个求次小生成树的问题, 如果求出来的次小生成树权值和与最小生 成树相同,则不唯一
次小生成树的定义
设G=(V , E , ω)是连通的无向图,T是图G的 一个最小生成树。如果有另一棵树T1,满 足不存在树T’ , T’ ≠ T , ω(T’)<ω(T1) , 则称T1是图G的次小生成树。
删去边的权值越 大,所得到的生 成树的权值和就 越小,因此,需 要找到环上可删 除的权值最大的 边并将其删除。
简单的枚举,时 间复杂度非常高。
应该使用动态 规划!
动态规划
设最小p度限制生成树为T , T是无根树,为 了简便,我们把v0作为该树的根。 定义Father(v)为T中v的父结点,Father(v0) 无意义。 设Best(v)为路径v0->v上与v0无关联且权值 最大的边。
即最小k+1度限制生成树属于最小k度限制生成树的邻集。
假设我们已经得到了最小p度限制生成树, 如何通过它来求最小p+1度限制生成树呢?
如图,假设我们 已经得到了v0度为 2时的最小生成树, 现在要求v0度为3 时的最小生成树。 V0枚举与源自0关联且 不在树上的边, 添加到树上。
为了使V0的度增 加,下面两条边 红色的边是不能 删除的。
还是应当掌握度限制生成树的正规算法
最小度限制生成树的定义
设G=(V,E,ω)是连通的无向图,v0 ∈V是特别 指定的一个顶点 , k为给定的一个正整数。 V0在T中的度为DT(v0)。
如果T是G的一个生成树且DT(v0) =k,则称T 为G的k度限制生成树。G中权值和最小的k 度限制生成树称为G的最小k度限制生成树。
ACM典型试题--简单的加密算法(一)
ACM典型试题--简单的加密算法(⼀)1. 题⽬描述简单的加密算法:把字符串中的字符替换成另外的字符,只有对⽅知道如何替换就可以解密。
要求根据给定的加密⽅法和密⽂,得到原始消息。
输⼊格式第⼀⾏输⼊密钥,第⼆⾏输⼊密⽂。
输出格式对输⼊的数据输出解密后的原始信息。
输⼊样例eydbkmiqugjxlvtzpnwohracsfKifq oua zarxa suar bti yaagrj fa xtfgrj输出样例Jump the fence when you seeing me coming2. 题⽬分析和算法实现第⼀⾏的“eydbkmiqugjxlvtzpnwohracsf”相当于密钥,含义是a 对应e、b 对应y、c 对应d…。
因此,只要把密⽂序列中的相应字符替换为对应后⾯的字符即可。
即对于“Kifq oua zarxa suar bti yaagrj fa xtfgrj”,把K 替换成J,把i 替换成u,把f 替换成m,…。
但要注意⼤⼩写。
编程的时候,可以定义数组表⽰密钥。
然后对密⽂进⾏遍历得到原始信息。
3. 问题实现及代码分析#include <stdio.h>int main( void ){char codeKey[128],codeWord[100],Decode[100];printf("\n输⼊密钥26个字母:");for (int i='a';i<='z';i++){scanf("%c",&codeKey[i]);codeKey[i-32]=codeKey[i]-32;}codeKey[127]='\0';printf("\n输⼊密钥为:");for (int i='a';i<='z';i++){printf("%c",codeKey[i]);}printf("\n输⼊密⽂:");getchar();gets(codeWord);int j=0;while(codeWord[j]!='\0'){if (codeWord[j]==' '){Decode[j]=codeWord[j];}else{Decode[j]=codeKey[codeWord[j]];}++j;}Decode[j]='\0';printf("\n解密为:");puts(Decode);}4.结果。
ACM 程序设计竞赛入门:第1讲 快速入门
2020/12/10
13
本类输入解决方案:
C语法:
scanf("%d",&n) ;
for( i=0 ; i<n ; i++ ) {
.... }
C++语法:
cin >> n;
for( i=0 ; i<n ; i++ )
{
....
}
2020/12/10
14
输入(3):
输入不说明有多少个Input Block,但以某 个特殊输入为结束标志。 参见:本校OJ1000
第一讲 快速入门
2020/12/10
1
ACM题目特点:
严格的输入、输出格式;有偏差则不能AC;
追求高效简洁的算法 。即便算法是正确的, 但策略过于复杂,会导致超时;
测试数据庞大;即便算法是正确的,如果在程 序实现时出现误差都会被严密的测试数据查出 而把程序判定为错误的;
强调解决实际问题的能力。赛题与实际应用的 联系很紧密,很多试题被出题者描述成一个有 趣的故事。因此,读题能力、分析能力相当重 要。
2020/12/10
4
困惑:用C/C++的输入/输出?
一般来说,差别不是太大,习惯就好; cin,cout 使用方便;scanf, printf 控制灵 活,在效率上有优势; 不要混用。 千万不要把cout和printf混用,因为cout 是带缓冲的而printf不带,所以会使得输 出的数据顺序混乱。
8
本类输入解决方案:
C语法:
while(scanf("%d %d",&a, &b) != EOF)
ACM_ICPC-2简单计算题一-限制下时间复杂度-ACM算法
题目分析:
• 能被3整除的整数的特点? • 如果两个数的和能被3整除,这两个数有什么特点? • 关于能否被3整除,这两个数一共有多少种组合?
还要看程序吗?
22/38
#include<stdio.h> int main() {
long n; while(scanf("%ld",&n) != EOF) if (n%8==2 || n%8==6)
3整除,她才会跟 Silentsky约会。比如,在第132天,1+3+2=6能被3整除,lcy就会答应和他约会;在第133天,1+3+3=7不能被3整除,lcy就 不会跟他约会。Silentsky很心急,他迫切地想知道,从第a天到第b天(包括第a天和第b天),
他能和lcy约会多少次,你能编写程序帮助他么?
20/38
• Sample input: 0123456
• Sample output: no no yes no no no yes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
21/38
winhitlex(c,yin;>>x>>y) { while(cin>>x>>y)
{ cout<<x*y/gcd(x,y)<<end1;
} cout<<x/gcd(x,y)*y<<end1;
}
re}turn 0; return 0;
}
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
ACM数论经典初级进阶1基础题目详解10道
if(b==0)
{
m=1;
n=0;
return ;
}
exgcd(b,a%b,m,n);
__int64 t;
t=m;
m=n;
n=t-a/b*n;
}
intmain()
{
__int64 x,y,m,n,l,a,b,c,k1,k2,r,t;
while(scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&l)!=EOF)
{
intm,n;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(gcd(m,n)==1)
printf("NO\n");
else
printf("YES\n");
}
}
9、
/JudgeOnline/problem.php?pid=317
这道题目同上面的题目差不多,只是比上面的略微复杂一点,思路是一样的所以直接上代码了:
#include<stdio.h>
intgcd(inty,intx)
{
returnx?gcd(x,y%x):y;
}
intmain()
{
intm,n,k,i;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(gcd(m,n)==1)
printf("NO\n");
else
{
k=gcd(m,n);
2|6 8 12
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ACM程序设计题目(ENGLISH)
2006-08-08 15:49
A developer has designed a subdivision within a city such that all roads connect at intersections in a treelike design. This is to prevent all petrolhead hooligans from disturbing the residents by not having any road loops for races. Only the entering intersection is connected to the rest of the city. The developer is selling off land alongside roads between adjacent intersections. A real estate agent has produced a book indicating the expected dollar profit (positive, zero or negative) that can be obtained by purchasing the land alongside each road.
Potential buyers want to maximize their profit, but prefer to buy a contiguous stretch of land alongside a simple road chain that connects two intersections of the subdivision. Your task is to write a program to determine the maximum non negative profit that can be obtained this way, and return 0 if no such profit can be obtained.
As an example, consider the following representation of a subdivision, where road labels represent expected profits. In this scenario, the maximum non negative profit is 7, and can be obtained alongside the road chain between the intersections #2 and #5:
Input
Input for this problem consists of a sequence of one or more scenarios. Each scenario contains two or more lines.
The first line contains an integer n , 1n500000 , indicating the number of intersections, including the entrance intersection,
implicitly labelled 0.
This is then followed by one or more lines, containing n - 1 pairs of integers. All integers are separated by single spaces or
newlines. The y -th intersection is defined by the y -th pair of
integers `x p', where 1y< n, 0x< y, -1000p1000 . This pair indicates a road segment between y and a previously defined intersection, x , with a profit value p .(Attention, for this
program, input lines may contain up to 4096 characters each!)
The input will be terminated by a line consisting of one zero (0). This line should not be processed.
Output
Output will be a sequence of lines, one for each input scenario. Each line will contain an integer, indicating the maximum nonnegative profit, over all possible simple road chains connecting two intersections of the subdivision. Write zero (0) if no profit can be obtained.
Sample Input
6
0 -1 1 3 0 2 1 1 1 4
6
0 2 0 1 0 2 0 1 1 1
5
0 1 1 -3 0 -2 1 -2
5
0 -1 1 -3 0 -2 1 -2
10
0 -1 0 -1 0 0 1 3 1 4 2 4 2 2 3
3 3 3
Sample Output
7
5
1。