| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 776 人关注过本帖
标题:NOIP2005普及组解题报告
只看楼主 加入收藏
过客101
Rank: 1
等 级:新手上路
威 望:1
帖 子:249
专家分:0
注 册:2006-11-26
收藏
 问题点数:0 回复次数:0 
NOIP2005普及组解题报告

NOIP2005普及组解题报告
陶陶摘苹果
apple.pas

本题是一道基础题,只要大家认真、细心都可以做出来,具体分析如下:

【具体分析】

首先将10个数输入放入A数组,然后将N(手可以够到的高度)加上30为站上椅子能够到的高度。最后将其与10个数进行比较把小于等于的加入累加变量Total。

【变量说明】

A:10个苹果的高度

N:手可以够到的高度

Total:累加器,累加可以摘的个数

【源程序】

Program apple;

var A:array[1..10] of integer;

N,I,Total:integer;

Begin

Assign(input,'in.in');reset(input);

for i:=1 to 10 do

read (a);

Readln(n);

Close(input);

N:=n+30;

For I:=1 to 10 do

If n>=a[I] then inc(total);

Assign(output,'apple.out');rewrite(output);

Writeln(total);

Close(output);

End.

校门外的树
tree.pas

本题是一道较为简单的题,不要把题目复杂化,具体分析如下:

【具体分析】

因为树的最大数量为10000,所以可以直接进行运算。首先设一标志数组为aa,false表示被移走,true表示还没有被移走,先赋值为true表示全没有被移走,然后输入表示要用做铁路的路段的两端点坐标。然后用循环把移走的树的标志数组赋值为false,最后对没有移走的进行累加,打印。

【变量说明】

aa:标志数组,表示树的状态,false表示被移走 true表示没有被移走

I,J:用做铁路的两端点坐标

S:累加器,累加没有被移走的个数

【源程序】

Program tree;

Var aa:array[0..10000]of boolean;

m,n,i,j,l,a,b,s:integer;

Begin

Assign(input,'tree.in');reset(input);

Assign(output,'tree.out');rewrite(output);

Readln(l,m);

For a:=0 to l do

aa[a]:=true;

For a:=1 to m do

Begin

Readln(i,j);

For b:=i to j do

aa:=false;

End;

For a:=0 to l do

if aa[a] then inc(s);

Writeln(s);

Close(input);

Close(output);

End.

循环

circle.pas

本题主要考察的是对字符串和数的处理,具体分析如下:

【具体分析】

大家都知道要取数的后面的N位就要用数去除以10n。所以题目就容易解决了。首先输入SS为要乘的正整数和要求的位数,因为输入的是一个字符串,所以只有找空格来读入两个数。将要乘的数放入s1中,剩下的length(ss)-I位为要求的位数放入k中。又因为经过实验发现当k超过20时是不存在的,所以当k大于20时可以直接打印-1,但相反如果小于20,首先对输入的 k进行处理,可以算出用于取后k位的L来。然后进行循环用输入的s1乘以s1再取后k位,然后又把新得到的要乘的数乘以s1在取后k位……依次反复,当得到的数的后k位等于s1的后k位时结束,否则依然继续直到循环10000次。

【变量说明】

ss:输入的要乘的数和要求的位数

s1:表示要乘的数

l:用来取最后k位的数

m:循环的次数

【源程序】

program circle;

var s1,s2,ss:string;

b,c,m,n,i,j,l,k,s:longint;

a:longint;

t,p:integer;

begin

assign(input,'circle.in');reset(input);

assign(output,'circle.out');rewrite(output);

readln(ss); {输入要乘的数和要求的位数k}

i:=pos(' ',ss); {找空格的位置分开两个数}

s1:=copy(ss,1,i-1);

val(copy(ss,i+1,length(ss)-i),k,t);

if k<20 then

begin

s2:=copy(s1,length(s1)-k+1,k);

val(s2,n,p);

l:=1;

s:=1;

for a:=1 to k do {求出要L的值}

l:=l*10;

s:=n;

repeat

inc(m);

s:=s*n mod l; {S*N mod L为下个循环的后k位}

until (s=n) or (m=100000);

if m=100000 then writeln(-1) else writeln(m);

end

else writeln(-1); {输出无解}

close(input);

close(output);

end.

搜索更多相关主题的帖子: 解题 
2007-01-01 16:15
快速回复:NOIP2005普及组解题报告
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.010879 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved