ACM程序设计-东北林业大学 acm01

合集下载

ACM程序设计算法讲解

ACM程序设计算法讲解

目录1.河内之塔 (3)2.Algorithm Gossip:费式数列 (4)3.巴斯卡三角形 (5)4。

Algorithm Gossip: 三色棋 (6)5.Algorithm Gossip:老鼠走迷官(一) (8)6.Algorithm Gossip: 老鼠走迷官(二) (10)7。

Algorithm Gossip: 骑士走棋盘 (11)8.Algorithm Gossip:八皇后 (14)9.Algorithm Gossip: 八枚银币 (16)10.Algorithm Gossip: 生命游戏 (18)11.Algorithm Gossip: 字串核对 (21)12。

Algorithm Gossip: 双色、三色河内塔 (23)13。

Algorithm Gossip: 背包问题(Knapsack Problem) (28)14。

Algorithm Gossip:蒙地卡罗法求PI (32)15.Algorithm Gossip: Eratosthenes筛选求质数 (34)16。

Algorithm Gossip: 超长整数运算(大数运算) (35)17.Algorithm Gossip: 长PI (37)18。

Algorithm Gossip: 最大公因数、最小公倍数、因式分解 (40)19。

Algorithm Gossip:完美数 (44)20.Algorithm Gossip: 阿姆斯壮数 (47)21。

Algorithm Gossip:最大访客数 (48)22。

Algorithm Gossip: 中序式转后序式(前序式) (50)23。

Algorithm Gossip:后序式的运算 (53)24.Algorithm Gossip:洗扑克牌(乱数排列) (55)25。

Algorithm Gossip:Craps赌博游戏 (57)26.Algorithm Gossip:约瑟夫问题(Josephus Problem) (59)27。

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程序设计竞赛基础教程

acm程序设计竞赛基础教程

acm程序设计竞赛基础教程
ACM程序设计竞赛基础教程是一本专门针对ACM程序设计竞赛的教程,该书由中国大学MOOC(慕课)在线教育平台和北京大学计算机科学与技术系合作,主要面向程序设计竞赛爱好者和准备参加竞赛的学生。

本教程共分为10个章节,从基础的算法和数据结构开始讲解,到高级的算法和数据结构,并涵盖了常见的编程语言和各种经典算法的实现和应用。

每个章节都有一些简单的例子和练习题,旨在帮助学生巩固所学的知识和提高编程能力。

本教程的作者是来自北京大学计算机科学与技术系的教授和研究生,他们有丰富的ACM竞赛经验和创新思维,对于如何有效地学习和练习编程有着深入的理解和实践。

同时,本教材也收录了一些国际著名的ACM竞赛题目和优秀的代码答案,以便学生更好地了解和掌握这个领域的最新进展和应用。

总之,ACM程序设计竞赛基础教程是一本集理论和实践于一体的学习资料,对于想要学习和了解ACM竞赛的人来说是一本必备的参考书。

【综合】Acm竞赛简介

【综合】Acm竞赛简介

Parity(ceoi99)(肖天)
• 建立sum数组,sum[i]表示从1到i之和是奇(true)还是偶 (false),sum[0]=false。这样题目中给的任意问题(a,b) 的答案都可以用sum[b] xor sum[a-1]表示。 • 开始我们并不知道sum[1..n]的值,不妨设为false,这时任意 sum[a],sum[b]都是独立的。对于每对问答(a,b,c),都可以 知道sum[b] xor sum[a-1]=c,由此把sum[b]和sum[a-1] 联系起来。这步操作可以用并查集完成,对于问答(a,b,c)如 果sum[a-1],sum[b]不属于一个集合就把它们并起来,否则 如果sum[a-1] xor sum[b]不等于c则说明出现矛盾,输出总 句数,退出。 • 对于不出现矛盾的sum数组,对于每个集合分为两个部分,我 们指定其中一个部分为true,另一个部分为false,则可以确定 sum数组,利用sum[i] xor sum[i-1]可以求出第i位的数字, 由于不同集合之间没有问答出现,所以此数列是一可行解,证 明算法正确。
• 但有时却是最好的办法
22
Pizza Anyone? (ZOJ 1219)
• 题目大意: 你需要为你和你的朋友们订一个皮萨。 每个朋友都会告诉你他们想和不想放进皮萨 里的东西。 你是否能订一个皮萨,让他满足每个人 至少一个条件。 假设一共有16种东西可以放进皮萨。
23
2 65536
16
是个对计算机很 小的数
3
ACM
ACM (Association for Computing Machinery) 成立于计算机诞生次年,是目前计算机学界中历史最 悠久、最具权威性的组织,是推进信息技术专业人员 和学生提高技巧的主要力量。ACM通过提供前沿技 术信息和从理论到实践的转化,为其全球7.5万名成 员服务,并已经成为信息科技领域的一个基本信息来 源。

ACM基本输入输出

ACM基本输入输出
int n,a,b; scanf(“%d”,&n); while (n--) {
scanf(“%d%d”,&a,&b) ; printf(“%d\n”,a+b); } return 0; }
第三类输入(HDOJ 1091)
第三类输入 (首先给出数据组数HDOJ 1091源代码)
// HDOJ 1091 A+B for Input-Output Practice (III) #include <stdio.h> int main() {
if(i>1) printf("\n"); sum=0; scanf("%d",&n); while(n--) {
scanf("%d",&a); sum+=a; } printf("%d\n",sum); }
总结一下:( 小技巧、规定)
1、main 函数返回值为int 型(正式比赛要求) 2、 scanf函数返回值就是读出的变量个数,没有读到数
int n,a,sum; while ( scanf("%d",&n), n ) {
sum=0; while ( n-- ) {
scanf("%d",&a); sum+=a; } printf("%d\n",sum); } return 0; }
HDOJ 1093
HDOJ 1093 源程序
int c,n,a,sum; scanf("%d",&c); while(c--) {
sum=0; scanf("%d",&n); while(n--) {

ACM数论01-素数(质数)的判断

ACM数论01-素数(质数)的判断

ACM数论01-素数(质数)的判断⽤代码判断素数(质数)素数,⼜名质数。

它的定义很简单:在⼤于1的⾃然数中,只有1和它本⾝两个因⼦的数,就是素数(质数)。

注:本⼈喜欢⽤质数这个名字,所以下⽂中都⽤质数代表素数质数的名字叫prime number,所以在代码中,我们对质数总是使⽤prime进⾏变量的命名,对质数判断的函数也会变成isprime()(是质数吗?)或者⼲脆⽤简写isp()根据定义,我们可以很轻松的写出判断⼀个质数的代码:(c++):bool isp(int n){for(int i = 2; i < n; i++){if(n % i == 0) return false;}return true;}(java):static boolean isp(int n){for(int i = 2; i < n; i++){if(n % i == 0) return false;}return true;}这⾥默认不考虑1到底是不是质数,因为1本⾝就不存在质数的定义中。

这样写是可以判断是否是质数的,但如果你了解过时间复杂度,你就会喊出:我的⽼天爷啊!这也太慢了!判断⼀个质数的时间复杂度⾼达了:O(N)如何更加快速地判断⼀个数是否是质数?这⾥我们要引⼊⼀个显⽽易见的论据。

如果⼀个数n能被d整除(或者说d整除n),那么n也⼀定能被n/d整除我们⽤数学符号表⽰:d|n⇒n d|n|是整除符号,表⽰右边的数可以被左边的数整除我们举个例⼦理解吧:3|18⇒183|183可以整除18,18/3也可以整除18,这是显⽽易见的。

因为如果存在⼀个⼤于1的⾃然数,它就⼀定能写成如下的形式:N=A∗B哪怕是质数,也可以写成1*本⾝的形式,如果它是个合数,那么A和B必定不是1和本⾝。

那么从这个显⽽易见的结论,我们可以推出另⼀个结论:⼀个⼤于1的合数,它的因⼦除了1和本⾝以外,总是成对出现的,不过这⼀对可能是⼀样的数,⽐如36=6*6。

ACM程序设计-东北林业大学 acm04

ACM程序设计-东北林业大学 acm04
2012-5-3 19
while(cin>>m>>n) { sum=0.0;k=0; if (m==-1&&n==-1) break; for(int i=0;i<n;i++) { cin>>data[i].j>>data[i].f; data[i].awk=(double)data[i].j/(double)data[i].f ; } sort(data,data+n,cmp);
2012-5-3 10
贪心法的一般过程 Greedy(C) //C是问题的输入集合即候选集合 { S={ }; //初始解集合为空集 while (not solution(S)) //集合S没有构成问题的一个解 { x=select(C); //在候选集合C中做贪心选择 if feasible(S, x) //判断集合S中加入x后的解是否可行 S=S+{x}; C=C-{x}; } return S; }
2012-5-3
23
用事实说话—— 用事实说话——
2012-5-3
24
一、事件序列问题
已知N个事件的发生时刻和结束时刻(见下表,表 中事件已按结束时刻升序排序)。一些在时间上没 有重叠的事件,可以构成一个事件序列,如事件 {2,8,10}。事件序列包含的事件数目,称为该事 件序列的长度。请编程找出一个最长的事件序列。
4
4.1贪心法的设计思想 贪心法的设计思想
贪心法在解决问题的策略上目光短浅, 贪心法在解决问题的策略上目光短浅,只根据当 前已有的信息就做出选择, 而且一旦做出了选择, 前已有的信息就做出选择 , 而且一旦做出了选择 , 不管将来有什么结果, 这个选择都不会改变。 不管将来有什么结果 , 这个选择都不会改变 。 换言 贪心法并不是从整体最优考虑, 之 , 贪心法并不是从整体最优考虑 , 它所做出的选 择只是在某种意义上的局部最优。 择只是在某种意义上的局部最优。 这种局部最优选择并不总能获得整体最优解 ( Optimal Solution) , 但通常能获得近似最优解 ) (Near-Optimal Solution)。 )

acm02

acm02

2010-11-23
5
计算阶乘N!
f(n)=n!可以定义为:
f (0) =1 =1 f (n) = f (n −1) × n
(n ≥ 1)
2010-11-23
6
代码:
#include<stdio.h> int f(int n){ return n == 0 ? 1 : f(n-1)*n; } int main(){ printf("%d\n", f(3)); return 0; }
2010-11-23 32
解题思路
这个题目可以描述成给定一点,计算它所在的连通区 域的面积。需要考虑的问题包括矩阵的大小,以及从 某一点出发向上下左右行走时,可能遇到的三种情况: 出了矩阵边界、遇到’.’、遇到’#’。 设f(x, y) f(x, y)为从点(x,y)出发能够走过的黑瓷砖总数,则 (x,y) f(x, y) = 1 + f(x - 1, y) + f(x + 1, y) + f(x, y - 1) + f(x, y + 1) 这里需要注意,凡是走过的瓷砖不能够被重复走过。 可以通过每走过一块瓷砖就将它作标记的方法保证不 重复计算任何瓷砖。
2010-11-23
8
县令:(心算)回知府大人,f(1)=1. 知府: (心算)回大人,f(2)=2. 大臣: (心算) 3*f(2)=6,回皇上, f(3)=6
2010-11-23
9
运行
计算f(3)=6; 计算f(100000000),没有输出,溢出也应 该有数啊! 是段错误! 段:是指二进制文件内的区域,某种特 定类型的信息被保存在里面。
2010-11-23 30
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
34
2013-7-30
算法的描述方法
⑴ 自然语言
优点:容易理解
缺点:冗长、二义性
使用方法:粗线条描述算法思想
注意事项:避免写成自然段
2013-7-30
35
欧几里德算法
① 输入m 和n;
② 求m除以n的余数r;
③ 若r等于0,则n为最大公约数,算法结束;
否则执行第④步;
④ 将n的值放在m中,将r的值放在n中;
ACM程序设计
东北林业大学 陈宇 Lg_chenyu@
第一讲
算法原理和ACM入门
(Introduction to ACM)
2013-7-30
2
我校的ACM在线评测系统

课件下载地址: /kj/suanfa01.ppt
48
2013-7-30

加密文本 ABCDEFGHIJKLMNOPQRS TUVWXYZ 明文文本 VWXYZABCDEFGHIJKLMN OPQRSTU 密文中只有字母被切换了,非字母的字 符应该保持不变,所有的字母都是大写 的。
49
2013-7-30
【输入】

这个问题的输入包括一系列(非空)最多100 个数据。每一个数据的格式会按照以下格式, 并且在不同组数据间不会有空行分隔。所有的 字符都是大写的。 一个单独的测试数据包括三个部分: 1. 开始行:单独的一行“START” 。 2. 加密的信息:单独的一行,由1~200个字符 组成来自Caesar的一行信息。 3. 结束行:单独的一行“END” 。 最后一组测试数据结束会跟着单独的一行 “ENDOFINPUT”。

2013-7-30
24
和算法执行时间相关的因素:
1)问题中数据存储的数据结构 2)算法采用的数学模型 3)算法设计的策略 4)问题的规模 5)实现算法的程序设计语言 6)编译算法产生的机器代码的质量 7)计算机执行指令的速度
2013-7-30 25
算法效率的衡量方法

通常有两种衡量算法效率的方法:
26
2013-7-30

一个算法中所有语句的频度之和构成了该算法的运行时间。 例如:


for(j=1;j<=n;++j)
for(k=1;k<=n;++k) ++x;


语句“++x、k<=n、++k”的频度是n2, 语句“ j=1、k=1”的频度是1, 语句“j<=n;++j”的频度是n。 算法运行时间为:3*n2+2n+2。
33
2013-7-30
【例3】变量计数之二




(1) x=1; (2) for(i=1;i<=n;i++) (3) for(j=1;j<=i;j++) (4) for(k=1;k<=j;k++) (5) x++; 该算法段中频度最大的语句是(5),从内层循环 向外层分析语句(5)的执行次数: 复杂度:O(n3)

Temp=i;i=j;j=temp;

以上三条单个语句的频度均为1,该算法段的执行 时间是一个与问题规模n无关的常数。算法的时间复杂 度为常数阶,记作T(n)=Ο(1)。
如果算法的执行时间不随着问题规模n的增加而增 长,即使算法中有上千条语句,其执行时间也不过是一 个较大的常数。此类算法的时间复杂度是Ο(1)。

2013-7-30
32
【例2】变量计数之一。

(1) (2) (3) (4) (5) (6)
x=0;=0; for(k-1;<=n;++) x++; for(i=1;<=n;++) for(j=1;j<=n;++) y++;


该算法段的时间复杂度为T(n)=Ο(n2)。 当有若干个循环语句时,算法的时间复杂度是由嵌 套层数最多的循环语句中最内层语句的频度f(n)决定的。
2013-7-30
27
再看看这个代码:
对较复杂的算法计算算法的运行时间,经常从算法中选取 一种对于所研究的问题来说是基本(或者说是主要) 的原操作, 以该基本操作在算法中重复执行的次数作为算法运行时间的衡 量准则。这个原操作,多数情况下是最深层次循环体内的语句 中的原操作。 例如: for(i=1;i<=n;++i) for(j=1;j<=n;++j) { c[i,j]=0; for(k=0;k<=n;++k) c[i,j]= c[i,j]+a[i,k]*b[k,j]; }
40
伪代码——算法语言
伪代码(Pseudocode):介于自然语言和 程序设计语言之间的方法,它采用某一程序 设计语言的基本语法,操作指令可以结合自 然语言来设计。 优点:表达能力强,抽象性强,容易理解
2013-7-30
41
欧几里德算法 1. r = m % n; 2. 循环直到 r 等于0 2.1 m = n; 2.2 n = r; 2.3 r = m % n; 3. 输出 n ;
2013-7-30
42
递归算法的分析
关键:根据递归过程建立递推关系式,然 后求解这个递推关系式。 1. 猜测技术:对递推关系式估计一个上限, 然后(用数学归纳法)证明它正确。
2013-7-30
43
扩展递归技术
设n=2k
7 n =1 T ( n) = 2T ( n 2 ) + 5 n2 n >1 T (n) = 2T ( n 2) + 5n2 = 2( 2T ( n 4) + 5( n 2)2 ) + 5n2 = 2( 2( 2T ( n 8) + 5( n 4)2 ) + 5( n 2)2 ) + 5n2 n = 2k T (1) + 2k -1 5( k -1 )2 + L + 2×´( n)2 + 5n2 5 2 2
2013-7-30
47
【问题描述】

Julius Caesar生活在一个危险而又充斥着阴谋 的时代。Caesar面对的最难的情况关系着他的 存亡。为了让自己生存,他决心去创造第一种 加密方法之一。这个加密方法听起来是这样的 令人难以置信,没有一个人可以指出它(的原 文)除非知道它怎样工作。 你是Caesar军队的一个分队长。你的工作是破 译Caesar送来的信息并汇报给你的上级。 密码很简单,每一个字母对应着一个明文,你 将明文向右五步来得到安全的信息。(比如, 假如那个字母是‘A’,密文就是‘F’)
k -1
n2 1 = 7 n + 5 i = 7 n + 5 n 2 ( 2 - k -1 ) = 10 n 2 - 3 n 10 n 2 = O ( n 2 T ( n) 2 i= 2013-7-30 0 2 44
通用分治递推式
大小为n的原问题分成若干个大小为n/b的子问题, 其中a个子问题需要求解,而cnk是合并各个子问题 的解需要的工作量。 c n =1 T ( n) = aT ( n b ) + cn k n>1
设计算法——设计出复杂性尽可能低的算法 选择算法——在多种算法中选择其中复杂性最低者
2013-7-30 23
评价算法

评价算法的三条主要标准是:
(1) 算法实现所耗费的时间; (2) 算法实现所所耗费的存储空间,其中 主要考虑辅助存储空间; (3) 算法应易于理解,易于编码,易于调 试等等。
2013-7-30 28

当一个算法的算法运行时间为n2+n+1, 由于n2+n+1与n2的数量级相等(该表达式 当n足够大时约等于n2), 我们说这个算法 的渐进时间复杂度(简称算法的时间复杂 度)为:T(n)=O(n2)。
2013-7-30
29
算法(渐进)时间复杂度,一般均表示为以下几种数量级的 形式(n为问题的规模,c为一常量):
O ( nlog a ) = O ( n k log b n) T ( n) k O ( n )
b
> bk a = bk a < bk a
45
2013-7-30
第二部分
编程基本知识
2013-7-30 46
先看这道题

The Hardest Problem Ever hdu1048 .cm 第60题
19
2013-7-30
20
2013-7-30
21
2013-7-30
22
第一部分 算法概述
算法分析(Algorithm Analysis):对算法所需 要的两种计算机资源——时间和空间进行估算
时间复杂性(Time Complexity) 空间复杂性(Space Complexity)
算法分析的目的:
50
2013-7-30
【输出】

对每一个测试数据只会有一行输出。它 是Caesar的原文。

2013-7-30
7
2010年的风采
2013-7-30
8
2013-7-30
9
2013-7-30
10
2013-7-30
11
2013-7-30
12
2013-7-30
13
2013-7-30
14
2013-7-30
15
2013-7-30
16
2013-7-30
相关文档
最新文档