NOIP1997普及组复赛第三题源程序

NOIP1997普及组复赛第三题源程序,第1张

#include <iostream>

using namespace std

typedef struct bignum {

int digits[20]

int len

} BigNum

int n, m, x1, yy1, x2, y2

BigNum c[51][51]

int inrect(int x, int y)

{

return x >= x1 &&x <= x2

&&y >颤裂御= yy1 &&y <= y2

}

void add(BigNum&num1, BigNum&num2)

{

int i, len, tmp

for (i = num1.leni <20i++)

num1.digits[i] = 0

for (i = num2.leni <20i++)

num2.digits[i] = 0

len = num1.len >num2.len ? num1.len : num2.len

for (i = 0, tmp = 0i <leni++)

{

tmp += num1.digits[i] + num2.digits[i]

num1.digits[i] = tmp % 10

tmp /= 10

}

num1.len = len

while (num1.len <20 &&tmp != 0)

{

num1.digits[num1.len++] = tmp % 10

tmp /= 10

}

}

int main()

{

int i, j

cin >>n >>m

cin >>x1 >>yy1 >>x2 >>y2

c[1][1].digits[0] = 1

c[1][1].len = 1

for (i = 1i <= ni++)

for (j = 1j <茄岩= mj++)

{

if (i != 1 || j != 1)

{

c[i][j].digits[0] = 0

c[i][j].len = 1

}

if (!inrect(i, j))

{

if (i >1)

add(c[i][j], c[i-1][j])

if (j >1)

add(c[i][j], c[i][j-1])

}

}

for (i = c[n][m].len - 1i >= 0i--)

cout <<c[n][m].digits[i]

cout <源坦<endl

return 0

}

我们老师写的,我正在学,老师讲一课做一课。一共10天,现有几 天,过一段时间补上。(给你qq吧)

本人打的,

no。1

一、学校网站网址:

外网:http://wyzxdj.gicp.net:88;内网:http://192.168.1.1:88

知识点:

(1)http——超 文本 传输 协议,ftp——文件 传输 协议

(2)网站有两类:http网站(web网站)、ftp网站

(3)域名与IP地址(在网络上计算机IP是唯一的)

(4)DNS域名解析系统——把域名解析为IP地址

(5)端口:65536个端口(其中一部分系统使用),web网站默认使用80端口(两头可以省略),ftp网站链悔肆默认使用21端口。

 

二、考试时间:

全国初赛(笔试、县级)10月的第3个星期六,2小时(100分)

全国复赛(上机、九江)11月的第3个星期六,上机棚轿3小时,四个大题(每题100分,共400分)

三、下载安装相关软件

下载安装FP——安装到D:下。注意:目录名为FP,复赛时有可能为PP

如果桌面有快捷方式,可以通过 右击→属性 获取路径。

四、计算机信息存储

计算机信息存储:文件形式(位置、名字)、表的形式(注册表、内存分配表、CMOS)

文件管理模式:通过文件夹(目录)来管理文件的

磁盘:分区使用。盘符(一个大写字母加:组成)

软驱(与软盘)分开:使用A与B,从C开始给硬盘(包含驱动器与盘片)和光驱(光驱与光盘分开)

每个分区都有一个根目录。形式:D:\A\B\C\1.txt

计算机中最高级文件夹是“桌面”

五、常用的DOS命令

1、 *** 作系统:Windows---视窗 *** 作系统(多任务、图形式)、DOS——磁盘 *** 作系统(单任务、字符式)

2、微软公司——MicroSoft,简称MS

3、cmd——由Windows进入模拟DOS窗口(开始→运行→cmd→确定)

4、模拟DOS窗口与全屏模式互换:alt+回车

5、关闭模拟DOS窗口:exit

6、磁盘命令 D: (回车)

7、在DOS下查看文件(夹)名 dir——会用 dir/p/w

dir/p——纵向看(相当于widnows中的“详细信息”前瞎)

dir/w——横向看(相当于widnows中的“列表”)

dir/p/w

?如何区别文件(夹)

dir或dir/p——有<dir>就是目录或者没有大小

dir/w/p——有方括号的就是目录

8、改变目录命令 CD

cd 目录名——打开一个目录

cd \fp\bin\go32v2

cd.. 回到上一级

cd\ 回到根目录

9、查看文本文件内容。type 1.pas

六、启动fp

d:

cd\fp\bin\go32v2

fp

退出:alt+x (选择是否保存)

七、fp主菜单

alt+红色字母

File文件、Edit编辑、Search查找、Run运行、Compile编译、Debug调试、Tools工具、Option选项、Windows窗口、Help帮助

File——New新建、F2保存、Exit

Edit——Cut剪切、Copy复制、paste粘贴、Clear清除

删除单个,使用 退格键或delete键

删除一行,使用 ctrl+Y

选择 *** 作:shift+方向键、home、end

Tools——ASCII table

F9——生成exe(先编译再链接)

=======================================================================

八、Free Pascal程序

1、程序由多条语句(简单语句和复合语句)组成;每条语句最后使用分号结束(end前可省略分号)。

2、程序结构:顺序结构、分支/选择结构、循环/重复结构、子程序结构(过程和函数)。

3、采取模块化思想、从上到下、逐步求精。

4、变量、常量问题

变量——单变量、数组变量、结构变量;命名:字母带头;全局变量、局部变量

5、要使用变量,必须先申请——合理定义(类型恰当---特别对于数组变量且个数很多)。

6、得不到满分的主要原因:有些情况有遗漏、变量定义范围小了、个数少了。

7、由begin……end.组成(end.整个程序中只能出现1次)

8、程序书写采用缩进式、使用空行分隔程序功能段

9、复赛要求:从.in文件中读取数据→编程处理→写到.out文件中

10、注释语句:单行使用 // ;多行使用{ }——用于调试

11、赋值语句: 变量使用“ :=”;常量使用“=”

12. 定义:

const pai=3.14

var a:integer //-3万2~3万2

b:longint //-21亿~21亿

c:byte //0~255

var x:array[3..10] of integer// a[3]到a[10]

13、常见出错信息

(1)Syntax error, expected but BEGIN found 语法错误,预期出现分号(;)但找到了BEGIN——Begin前少了分号(;)

(2)Identifier not found INTEGER1 没找到标识符INTEGER1——标识符单词有错

(3)Illegal expression 非法的表达式——赋值语句使用了“=”

九、读数据讲解:2004第1题

(1)建立.in输入文件——建议使用edit unhappy.in

(2)使用type unhappy.in检查.in是否正确

(2)编程从.in中读取数据

var f:text //定义一个变量f,用于 *** 作文件

a:array[1..7,1..2] of byte

i:byte

begin

assign(f,'unhappy.in') //指针指向文件

reset(f) // 指针指向第1个字符

for i:=1 to 7 do readln(f,a[i,1],a[i,2])

close(f) //关闭指针

//显示读结果

for i:=1 to 7 do wrtieln(a[i,1],' ',a[i,2])

end.

 

no.2

一、整型数据(复习)

var a:byte

b:integer

c:longint

二、子界型数据(只能使用整型)

1..100

三、实型数据

说明:

(1)可以存放小数、也可以存放整型数据

(2)使用了“/”运算、sqrt()开平方,其结果必须使用实型变量保存

(3)使用整除 div、求余 mod,其结果可以使用整型变量存放

(4)在for …… to ……do……或for……downto……do……中,只能使用整型数据或整型变量

var a:single:

b:real

c:double

四、逻辑/布尔数据

说明:

(1)每个变量占用1个位。

(2)其结果不是true就是false

var a:boolean

b:array[1..1000] of boolean

逻辑运算:

(1)单目运算:not,非。书写:~、……

(2)双目运算:and, 与。书写:∧、∩、……,口诀:同真为真,其余为假(1真3假)——等于“乘法*”

(3)双目运算:or, 或。书写:∨、∪、……,口诀:同假为假,其余为真(1假3真)——类似“加法+”但1+1=1

(4)双目运算:xor, 异或。书写:⊕、……, 口诀:同假异真。(2真2假)——类似“加法+”但1⊕1=0

知识:

(1)如果进行双目逻辑运算,逻辑表达式必须使用()。例: a=0 and b 是错误的。正确的应是:(a=0) and b

(2)初赛试题中进行逻辑运算时:可以将true用1替换,false用0替换,and/∧/∩用*替换,or/∨/∪用+替换,xor用⊕,按从左到右运算(除方括号以外)

(3)以下例题解题思路:

下列逻辑运算不正确的是(______)。(说明:“•”为逻辑与/逻辑乘,“+”为逻辑或/逻辑加,“⊕”为“逻辑异或”,字母上面的横线为“逻辑非”)

A A•(A + B)= A

B A +(A•B)= A

C A•(B + C)= A•B + A•C

D A +(B•C)=(A + B)•(A + C)

E A + 1 = A

思路:分A=1或A=0两种情况讨论

例题讲解(问题求解):

(取石子游戏) 现有5堆石子,石子数依次为3,5,7,19,50甲乙两人轮流从任一堆中任取(每次只能取自一堆,不能不取), 取最后一颗石子的一方获胜。甲先取,问甲有没有获胜策略(即无论乙怎样取,甲只要不失误,都能获胜)?如果有,甲第一步应该在哪一堆里取多少?请写出你的结果:

甲(______)获胜策略(填“有”或“没有”)。

如有获胜策略,第一步应该在第(______)堆中取(______)颗石子。

解答:博弈原理。讲求平衡性,对所有数进行xor,其值=0时为平衡状态。谁打破平衡状态谁输!

 

五:字符型数据

说明:只存放一个字符。

var a:char

====================================================================

六:字符串型数据

说明:

(1)不超过255个字符

(2)定长和变长

(3)自动分割为字符数组。相当于字符数组,设s为字符串数据,则s[2]表示s中的第2个字符

(4)函数不能单独成句,但可以用于赋值语句或输出语句中。

过程单独成句,就是一条完成的语句。

(5)求长函数length(s)

(6)查找函数pos(s1,s)——s1子串,s源串,返回找到的第1个位置(返回0,表示没找到)

(7)连接函数concat(s1,s2,s3,……)——将s2,s3……依次加在s1后面,最后返回s1。可以使用s1=s1+s2+s3+……

(8)截取函数copy(s,i,L)——在S中的第i个位置开始截取长为L的字符串

(9)删除过程delete(s,i,L)——删除S中第i个开始长为L的字符串,返回S

(10)插入过程insert(s1,s,i)——将s1插入在s中的第i个位置,返回S

(11)数字变字串过程str(12,s)——返回s='12'

(12)数值字串变数字过程val('125',a)——返回a=125

var a:string //变长

var b:string[20] //定长

七、分支结构

(1)2分支——else前不能有分号

if 条件 then 语句1;

if 条件 then 语句1 else 语句2;

if 条件 then

begin

语句组1

end

else

begin

语句组2;

end

if 条件1 then

语句组1

else if 条件2 then

语句组2

……

else

语句组

(2)多分支

case 表达式 of

常量1:语句1;

常量2:语句2;

……

常量:语句;

else 语句n+1 //可选项

end

多分支应用:根据年、月输出该月多少天?

case m of //m代表月

1,3,5,7,8,10,12:days:=31 //days代表该月天数

4,6,9,11:days:=30

2:if (y mod 400=0) or ((y mod 4=0) and (y mod 100<>0)) then days:=29 else days:=28

end

八、循环/重复结构

(1)限定次数

for … to … do 语句组; //循环变量自动累加1,前小后大。

for … downto … do 语句组; //循环变量自动累减1,前大后小。

(2)不定次数

while 条件 do 语句组;

repeat

语句组

end

(3)退出循环使用 break同时退出多层循环,一般采用设置一个逻辑变量+break来实现。

九:函数与过程区别

(1)关键字不同

(2)函数有数据类型,过程没有。

(3)过程通过参数带来结果(必须使用var),而函数只能通过函数名带回一个结果。

(4)过程单独成句子;函数只能用于赋值语句或输出语句中。

 

十、2011年初赛阅读程序第三题讲解

原题:

begin

readln(s)

m1=' '

m2=' '

for i:=1 to length(s) do

if s[i]>m1 then

begin

m2:=m1

m1:=s[i]

end

else if s[i]>m2 then

m2:=s[i]

writeln(ord(m1),' ',ord(m2))

end.

 

十一、2011年初赛阅读程序第四题讲解

可以将原题进行“处理”(将循环结构改成顺序结构),增加易读性,但必须与原题完全等价。

说明:本题使用了函数,并且使用“递归调用”——自己调用自己

function r(n:integer):integer

var i:integer

begin

if n<=5 then

begin

r:=n

exit //出口

end

if r(n-1)<0 then begin r:=1exitend //①出口

if r(n-2)<0 then begin r:=2exitend //②出口

if r(n-3)<0 then begin r:=3exitend //③出口

if r(n-4)<0 then begin r:=4exitend //④出口

if r(n-5)<0 then begin r:=5exitend //⑤出口

r:=-1//出口

end

begin

readln(n)

writeln(r(n))

end.

分析:函数r(n)有多个出口!。

(1)输入值为7或16

(2)n<=5时,返回原值,即:

r(5)=5

r(4)=4

r(3)=3

r(2)=2

r(1)=1

(3)n=6时,

计算r(5)——返回5,①不执行,执行下一步

计算r(4)——返回4,②不执行,执行下一步

计算r(3)——返回3,③不执行,执行下一步

计算r(2)——返回2,④不执行,执行下一步

计算r(1)——返回1,⑤不执行,执行下一步

所以r=-11,即r(6)=-1

(4)n=7时,

计算r(6)——返回-1,①执行,所以r(7)=1

(5)n=8时,

计算r(7)——返回1

计算r(6)——返回-1,②执行,所以r(8)=2

(6)n=9时,

计算r(8)——返回2

计算r(7)——返回1

计算r(6)——返回-1,③执行,所以r(9)=3

(7)n=10时,

计算r(9)——返回3

计算r(8)——返回2

计算r(7)——返回1

计算r(6)——返回-1,④执行,所以r(10)=4

(8)n=11时,

计算r(10)——返回4

计算r(9)——返回3

计算r(8)——返回2

计算r(7)——返回1

计算r(6)——返回-1,⑤执行,所以r(11)=5

(9)n=12时,

计算r(11)——返回5

计算r(10)——返回4

计算r(9)——返回3

计算r(8)——返回2

计算r(7)——返回1

r=-1,即r(12)=-1

可以得出规律:

n=6 7 8 9 10 11 12 13 14 15 16

r(n)=-1 1 2 3 4 5 -1 1 2 3 4 5 -1 1 2 3 4 5

 

no.3

一、 ASCII码

将键盘上的所有键进行编号,就可看作ASCII码,必须记住:

空格 20H,即32

数字 0~9,ASCII码30H~39H,即48~57

字母 A~Z,ASCII码41H~5AH,即65~90

字母 a~z,ASCII码61H~6AH,即97~122

二、信息的单位

位——bit/b,表示0或1

字节——byte/B,网速 Mbps其中bps:位每秒,1B=8bit

扇区——512B

千字节——KB,1K=1024B=2扇区,需要记住:2E+10=1024

兆字节——MB,1M=1024K

吉字节——GB,1G=1024M

特字节——TB,1T=1024G

三、字符ASCII码占用大小

1个英文字符占用1个字节,1个汉字占用2个字节。

四、字库

点阵字(横向的点*纵向的点)、曲线字

24*24点阵,需要多少存储空间。24*24/8B=72字节,但ASCII码占2B

五、进制——2、8、10、16进制

在计算机内部,一切信息存取、处理和传递的形式是2进制。

机内码:使用94区*94位,其中16区1位,就是“啊”,一级汉字按拼音、二级汉字按部首

ASCII码是7位编号,存储时使用8位(即1B),其中最高位(左起第1位用于区分英文、中文)

地址码:以字节为单位,以16进制为准,从0#开始。

例:128KB的存储器用十六进制表示,它的最大的地址码是(______)。

知识点:凡是2的倍数,如从1#编号,地址码形式:10000……, 如果从0#开始,地址码形式:FFFFF……

128KB约等于128*1000B

FFFFF=15^5>10^5=100000B

 

六、2009年初赛阅读程序第2题

原代码(处理):

b[0]:=2b[1]:=3b[2]:=5

 for i := 0 to 2 do begin

a[i] := 0

for j := 0 to i do begin

 inc(a[i], b[j])

 inc(b[a[i] mod 3], a[j])

end

 end

分析:采用列表法:

i j a[0] a[1] a[2] b[0] b[1] b[2]

初始化 0 0 0 2 3 5

0 0 2         7

1 0   2       9

1   5       14

2 0     2     16

1     5     21

2     26     47

tmp := 1

 for i := 0 to 2 do begin

a[i] := a[i] mod 10

b[i] := b[i] mod 10

tmp := tmp * (a[i] + b[i])

 end

功能:个位数之和相乘

tmp:=(2+2)*(5+3)*(6+7)=4*8*13=416

================================================================================

七、常用进制——2、8、10、16进制

(1) 书写方式:(101)2、(127)8……

书写方式:(101)2、(101)16、……

书写方式:101B、101O、101D、101H……

(2)n进制:只能使用0、1、2、3、4、5……n-1、小数点、正负号

(3)进行四则运算:逢n进一、借一当n

加法:先本位相加,再考虑进位

减法:不够减先借位,再相减

乘法:先各位相乘,再相加、最后考虑进位

(4)进制转换

第1种类型:2、8、16→10进制

第2种类型:10→2、8、16进制

第3种类型:8→2→16进制

经验:公式条

2进制: ……8 4 2 1.1/2 1/4 ……

8进制: …… 64 8 1.1/8 1/64 ……

16进制: …… 256 16 1.1/16 1/256 ……

例题讲解:

与十进制数1770对应的八进制数是(______)。

A 3350

B 3351

C 3352

D 3540

分析:1770 mod 8 就是答案的个数,1770 mod 64就是答案的十位.

(2010)16+(32)8的结果是(______)。

A (8234)10

B (202B)16

C (20056)8

D (100000000110)2

分析:题目的值对8求余,结果=2

B、C、D对8求余<>2,所以答案为A

(3725)8+(B)16的运算结果是(______)。

A (3736)8

B (2016)10

C (1111110000)2

D (3006)10

E (7B0)16

分析:值=(3725)8+11=(3740)8=(011 111 100 000)2,答案为E

(2004)10 +(32)16的结果是(______)。

A (2036)10

B (2054)16

C (4006)10

D (100000000110)2

E (2036)16

分析:值=2004+50=2054,A/B/C/E不对

运算(-17) MOD (-4) 的结果是(______)。

A 7

B 4

C 1

D -1

分析:a mod b的正负以左边的a为准

八、写文件

assign(f,'tree.out')rewrite(f)

……

close(f)

#include "stdio.h"枯乱

#include "string.h"没悔档前轮

#define N 14

char array[N]

int len,max=0,d[15][15]

int p(int x,int y,int k)

void dd(int p,int q)

int main()

{

int i,j,times

char time

scanf("%s %c",array,&time)

times=time-48

len=strlen(array)

for(i=0i<leni++)

for(j=ij<lenj++)

dd(i,j)

p(0,len-times,times)

printf("%d\n",max)

return 0

}

void dd(int p,int q)

{

int pow(int a,int b)

int i,k,sum=0

for(i=q,k=0i>=pi--,k++)

sum=sum+(array[i]-48)*pow(10,k)

d[p][q]=sum

}

int pow(int a,int b)

{

int i,t=1

for(i=1i<=bi++)

t*=a

return t

}

int p(int x,int y,int k)

{

int big

if(k==0)

return d[x][y]

for(y=xy<len-ky++)

{

big=d[x][y]*p(y+1,len-k,k-1)

if(big>max)

max=big

}

return big

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12313211.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存