noip2015普及组题解最终分解

noip2015普及组题解最终分解
noip2015普及组题解最终分解

本次试题前2题比较简单,34题容易拿到部分分,但满分有难度1. 金币

(coin.cpp/c/pas)

【问题描述】

国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续N天每天收到N枚金币后,骑士会在之后的连续N+1天里,每天收到N+1枚金币。

请计算在前K天里,骑士一共获得了多少金币。

【输入格式】

输入文件名为coin.in。

输入文件只有1行,包含一个正整数K,表示发放金币的天数。

【输出格式】

输出文件名为coin.out。

输出文件只有1行,包含一个正整数,即骑士收到的金币数。

【样例输入】coin.in

6

【样例输出】coin.out

14

【输入输出样例1说明】

骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到1+2+2+3+3+3=14枚金币。

【数据范围】对于100%的数据,1 ≤K ≤10,000。

【题解】

关注到K的范围是10000后,就不需要考虑数学公式,纯模拟就行,考点就是for循环了

var i,j,count,n,ans:longint;

begin

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

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

readln(n);

for i:=1 to 1000 do

for j:=1 to i do

begin

inc(count);

inc(ans,i);

if count=n then begin

writeln(ans);

close(input);close(output);

halt;

end;

end;

end.

2.扫雷游戏

(mine.cpp/c/pas)

【问题描述】

扫雷游戏是一款十分经典的单机小游戏。在n行m列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。

现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

【输入格式】

输入文件名为mine.in。

输入文件第一行是用一个空格隔开的两个整数n和m,分别表示雷区的行数和列数。

接下来n行,每行m个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。

【输出格式】

输出文件名为mine.out。

输出文件包含n行,每行m个字符,描述整个雷区。用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

【样例输入】

3 3

*??

???

?*?

【样例输出】

*10

221

1*1

【数据说明】

对于100%的数据,1≤n≤100,1≤m≤100。

【题解】

行列数最多100,也就是100*100的单元格数量,一个个判断过去也就100*100*8个方向,判断边界时注意数组的下标别越界就行了。考点还是for循环哦,可以考虑使用增量数组,不过就8个方向手写也很快的。

var

n,m,i,j,count:longint;

a:array[0..101,0..101] of char;

begin

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

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

readln(n,m);

for i:=1 to n do begin

for j:=1 to m do

read(a[i,j]);

readln;

end;

for i:=1 to n do begin

for j:=1 to m do

if a[i,j]='*' then write(a[i,j])

else begin

count:=0;

if a[i-1,j-1]='*' then inc(count);

if a[i-1,j]='*' then inc(count);

if a[i-1,j+1]='*' then inc(count);

if a[i,j-1]='*' then inc(count);

if a[i,j+1]='*' then inc(count);

if a[i+1,j-1]='*' then inc(count);

if a[i+1,j]='*' then inc(count);

if a[i+1,j+1]='*' then inc(count);

write(count);

end;

writeln;

end;

close(input);close(output);

end.

3. 求和

(sum.cpp/c/pas)

【问题描述】

一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n。每个格子上都染了一种颜色(用[1,m]当中的一个整数表示),并且写了一个数字。

定义一种特殊的三元组:(x, y, z),其中x,y,z都代表纸带上格子的编号,这里的三元组要

求满足以下两个条件:

1. ,,都是整数,<<, ? = ?

2. =

满足上述条件的三元组的分数规定为(x+z)?( +)。整个纸带的分数规定为所有满足条件的三元组的分数的和。这个分数可能会很大,你只要输出整个纸带的分数除以10,007所得的余数即可。

【输入格式】

输入文件名为sum.in。

第一行是用一个空格隔开的两个正整数和,代表纸带上格子的个数,代表纸带上颜色的种类数。

第二行有个用空格隔开的正整数,第个数字代表纸带上编号为的格子上面写的数字。

第三行有个用空格隔开的正整数,第个数字代表纸带上编号为的格子染的颜色。【输出格式】

输出文件名为sum.out。

共一行,一个整数,表示所求的纸带分数除以10,007所得的余数。

【样例输入】

6 2

5 5 3 2 2 2

2 2 1 1 2 1

【样例输出】

82

【输入输出样例1说明】

纸带如题目描述中的图所示。

所有满足条件的三元组为:(1,3,5),(4,5,6)。

所以纸带的分数为(1+5)?(5+2)+(4+6)?(2+2)=42+40=82。

【数据说明】

对于第1组至第2组数据,1≤ ≤100,1≤ ≤5;

对于第3组至第4组数据,1≤ ≤3000,1≤ ≤100;

对于第5组至第6组数据,1≤ ≤100000,1≤ ≤100000,且不存在出现次数超过20的颜色;

对于全部10组数据,1≤ ≤100000,1≤ ≤100000,1≤ ≤ ,1≤ ≤100000。

【题解】

可以理解为n个元素每个元素有三个属性分别是数值Number、颜色和编号,对于任意两个满足2个条件的元素进行相应的统计,第1个条件其实等价于这两个元素的编号都是奇数或都是偶数,第2个条件是相同颜色值。

观察数据范围我们可以发现前4组数据的n只有3000,O(N^2)的算法就能拿分,直接穷举任意两个元素,这个代码非常简短的:

var //预期得 40分的程序

n,m,i,j:longint;

a,b:array[0..100000] of qword;

ans:qword;

begin

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

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

readln(n,m);

for i:=1 to n do read(a[i]);readln;

for i:=1 to n do read(b[i]);readln;

for i:=1 to n do

for j:=i+1 to n do

if not odd(i+j) and (b[i]=b[j]) then begin

ans:=(ans+(a[i]+a[j])*(i+j)) mod 10007;

end;

writeln(ans);

close(input);close(output);

end.

如何避免超时呢?

介绍两种满分的方法

【第一种方法】从给出公式入手:(假设编号为x1,x2,x3,x4,x5的元素彼此间都符合题目要求的2个条件,其实就是它们的奇偶性相同、颜色相同)

(x1+x2)?( 1+x2)

(x1+x3)?( 1+x3)

(x1+x4)?( 1+x4)

(x1+x5)?( 1+x5)

(x2+x3)?( 2+x3)

(x2+x4)*(nu2+x4)

(x2+x5)*(nu2+x5)

(x3+x4)*(nu3+x4)

(x3+x5)*(nu3+x5)

(x4+x5)*(nu4+x5)

(1)把它们展开来就能发现xi*i的数量都就是5-1=4个,如果这样的元素有N 个,则有N-1个xi*i

(2)然后是

x1(x2+x3+x4 +x5)+ x2(x3+x4+x5)+ x3 (x4+x5)+ x4 *x5

(3)类似的

1(x2+x3+x4+x5)+ 2(x3+x4+x5)+ 3(x4+x5)+ 4*x5 (2)和(3)我们可以归为一类(考虑有n个符合条件的元素)

(2)的推广式是Xi(xi+1+……+ xn)

(3)的推广式是xi(X i+1+……+ Xn)

有了这个公式的建立,针对N个彼此颜色相同奇偶性相同的元素,可以用O(n)的时间求得题目要求的值:

首先O(n)的遍历i

然后是O(1)的求取(2)(3)的值:sumid[i]表示编号的总和,sumni表示number的总和,havid[i]

表示1到i的编号总和,havni[i]表示1到i的number总和,于是(2)(3)式子中的括号部分可以用sumid-havid[i]、sumni-havni[i]来表示。

那么如何挑选出这些元素,换句话说就是如何归类出颜色相同奇偶性相同的元素,我们可以用双关键字排序(颜色主关键字,奇偶性次关键字),当然还有其他方式用O(nlogn)、O(n)的排序都可以,二维数组统计颜色、奇偶性都可以,这里我采用了快速排序。最终程序的时间复杂度就是O(NlogN)

const cs=10007;//预期满分程序

type arr=record

x,y,id:int64;

z:boolean;

end;

var

a:array[0..100001] of arr;

sumid,sumni,sum,ans,tot:int64;

tmpc,i,count,n,m:longint;

havid,havni:int64;

tmpodd:boolean;

procedure deal;

var j:longint;

begin

tot:=0;havid:=0;havni:=0;//sumid,sumni表示编号、数字总和,havid,havni 表示编号、数字前缀和

for j:=count downto 1 do begin

inc(havid,a[i-j].id);inc(havni,a[i-j].x);

tot:=(tot+a[i-j].x*(sumid-havid))mod cs;//总和-前缀和就能得到我们想要的后缀和,题解中提取的公式运用

tot:=(tot+a[i-j].id*(sumni-havni)) mod cs;

end;

ans:=ans+tot;

ans:=((sum mod cs)*(count-1)+ans) mod cs;

end;

procedure qsort(h,t:longint);

var x,i,j:longint;

tmp:arr;

begin

x:=random(t-h+1)+h;

tmp:=a[h];a[h]:=a[x];a[x]:=tmp;

i:=h;j:=t;

tmp:=a[i];

while i

while (itmp.y) or (a[j].y=tmp.y) and (a[j].z>tmp.z)) do dec(j);

if i

a[i]:=a[j];

inc(i);

end;

while (i

if i

a[j]:=a[i];

dec(j);

end;

end;

a[i]:=tmp;

if h

if i+1

end;

begin

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

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

readln(n,m);

randomize;

for i:=1 to n do read(a[i].x);readln;//表示number

for i:=1 to n do read(a[i].y);readln;//表示颜色

for i:=1 to n do begin

a[i].id:=i;

a[i].z:=odd(i);//奇偶

end;

qsort(1,n);//颜色主关键字,奇偶次关键字排序

i:=1;

while i<=n+1 do begin

if (tmpc<>a[i].y) or (tmpodd<>a[i].z) then begin //tmpc表示上一段颜色值,tmpodd表示上一段奇偶值

if count>1 then deal;

sumid:=a[i].id;sumni:=a[i].x;sum:=sumid*sumni;

tmpc:=a[i].y;

tmpodd:=a[i].z;

count:=1;

end

else begin

sumid:=(sumid+a[i].id);

sumni:=(sumni+a[i].x);

sum:=(sum+(a[i].id*a[i].x));

inc(count);

end;

inc(i);

end;

writeln(ans);

close(input);close(output);

end.

【第二种方法】

其实题目算式还有一种更彻底的转化:

(X1+X2)?( 1+x2)

(X1+X3)?( 1+X3)

(X1+X4)?( 1+X4)

(X1+X5)?( 1+X5)

……

(X1+Xn)?( 1+Xn)

(X2+X3)?( 2+X3)

(X2+X4)*(nu2+X4)

(X2+X5)*(nu2+X5)

……

(X2+Xn)*(nu2+Xn)

(Xi+Xi+1)*(nu i+Xi+1)

……

(Xi+Xn)*(nu i+Xn)

……

(Xn-1+Xn)*(nu Xn-1+Xn)

为了方便描述以上式子统一表示成(A+B)*(C+D)

所有的A*C和B*D最终形成①式(n-1)( X1 1+…Xi nu i +Xn Xn) 所有的B*C和A*D最终形成

X1 (x2+……Xn)

X2(x1+ x3……Xn)

……

Xi(x1+……xi-1+xi+1……Xn)

……

Xn(x1+……Xn-1)

通项式为Xi(number总和-xi)=②式Xi*number总和-Xi* xi

①+②式即为xi*number总和-(N-2)*(xi* xi)

n项求和后就是(X总和*number总和)-(N-2)*(x1* x1+……+ xn* n)

程序如下:

const cs=10007;//这里使用一个二维数组统计同种颜色同奇偶性的个数,以及相应和var

n,m,i,j,colour:longint;

sumid,sumn,sum,count:array[0..100001,0..1] of qword;

ans:qword;

number:array[0..100001] of longint;

begin

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

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

readln(n,m);

for i:=1 to n do read(number[i]);readln;

for i:=1 to n do begin

read(colour);

sumid[colour,i mod 2]:=(sumid[colour,i mod 2]+i) mod cs;

inc(count[colour,i mod 2]);

sumn[colour,i mod 2]:=(sumn[colour,i mod 2]+number[i]) mod cs;

sum[colour,i mod 2]:=(sum[colour,i mod 2]+(number[i] mod cs)*(i mod cs) mod cs) mod cs;

end;

readln;

for i:=1 to m do

for j:=0 to 1 do

if count[i,j]>1 then ans:=(ans + sumid[i,j]*sumn[i,j] mod cs+(count[i,j]-2)*sum[i,j] mod cs) mod cs;

writeln(ans);

close(input);close(output);

end.

第一种方法对公式转化的要求比较低,代码稍长,使用排序统计划分出同种颜色同奇偶性,时间复杂度就是排序的时间复杂度O(NlogN);

第二种方法对公式转化很彻底,代码很短,使用二维数组分出同种颜色同奇偶性,时间复杂度是O(N);

这两种方法基本涵盖了解决此题的各种方法。

4.推销员

(salesman.cpp/c/pas)

【问题描述】

阿明是一名推销员,他奉命到螺丝街推销他们公司的产品。螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户。螺丝街一共有N家住户,第i家住户到入口的距离为S i米。由于同一栋房子里可以有多家住户,所以可能有多家住户与入口的距离相等。阿明会从入口进入,依次向螺丝街的X家住户推销产品,然后再原路走出去。

阿明每走1米就会积累1点疲劳值,向第i家住户推销产品会积累A i点疲劳值。阿明是工作狂,他想知道,对于不同的X,在不走多余的路的前提下,他最多可以积累多少点疲劳值。

【输入格式】

输入文件名为salesman.in。

第一行有一个正整数N,表示螺丝街住户的数量。

接下来的一行有N个正整数,其中第i个整数S i表示第i家住户到入口的距离。数据保证

S1≤S2≤…≤S n<108。

接下来的一行有N个正整数,其中第i个整数A i表示向第i户住户推销产品会积累的疲劳值。数据保证A i<103。

【输出格式】

输出文件名为salesman.out。

输出N行,每行一个正整数,第i行整数表示当X=i时,阿明最多积累的疲劳值。

【样例输入1】

5

1 2 3 4 5

1 2 3 4 5

【样例输出1】

15

19

22

24

25

【输入输出样例1说明】

X=1: 向住户5推销,往返走路的疲劳值为5+5,推销的疲劳值为5,总疲劳值为15。

X=2: 向住户4、5推销,往返走路的疲劳值为5+5,推销的疲劳值为4+5,总疲劳值为

5+5+4+5=19。

X=3: 向住户3、4、5推销,往返走路的疲劳值为5+5,推销的疲劳值3+4+5,总疲劳值为5+5+3+4+5=22。

X=4: 向住户2、3、4、5推销,往返走路的疲劳值为5+5,推销的疲劳值2+3+4+5,总疲劳值5+5+2+3+4+5=24。

X=5: 向住户1、2、3、4、5推销,往返走路的疲劳值为5+5,推销的疲劳值1+2+3+4+5,总疲劳值5+5+1+2+3+4+5=25。

【样例输入2】

5

1 2 2 4 5

5 4 3 4 1

【样例输出2】

12

17

21

24

27

【输入输出样例2说明】

X=1:向住户4推销,往返走路的疲劳值为4+4,推销的疲劳值为4,总疲劳值4+4+4=12。X=2:向住户1、4推销,往返走路的疲劳值为4+4,推销的疲劳值为5+4,总疲劳值

4+4+5+4=17。

X=3:向住户1、2、4推销,往返走路的疲劳值为4+4,推销的疲劳值为5+4+4,总疲劳值4+4+5+4+4=21。

X=4:向住户1、2、3、4推销,往返走路的疲劳值为4+4,推销的疲劳值为5+4+3+4,总疲劳值4+4+5+4+3+4=24。或者向住户1、2、4、5推销,往返走路的疲劳值为5+5,推销的疲劳值为5+4+4+1,总疲劳值5+5+5+4+4+1=24。

X=5:向住户1、2、3、4、5推销,往返走路的疲劳值为5+5,推销的疲劳值为5+4+3+4+1,总疲劳值5+5+5+4+3+4+1=27。

【样例输入输出3】

见选手目录下的salesman/salesman3.in和salesman/salesman3.ans。

【数据说明】

对于20%的数据,1≤N≤20;

对于40%的数据,1≤N≤100;

对于60%的数据,1≤N≤1000;

对于100%的数据,1≤N≤100000。

【题解】

这道题目距离Si是保证严格不降的,对于前60分,只需要O(N^2)的算法

O(N^2)的算法的关键是要发现找最大疲劳值,要么是在距离点内找疲劳值最大的点,要么是增加距离范围找到一个(疲劳值+增加的往返距离值最大)的点。

var i,j,n,k,maX,tot,tmp:longint;

get:array[0..100000] of boolean;

a,s:array[0..100000] of longint;

begin

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

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

readln(n);

for i:=1 to n do read(s[i]);readln;

for i:=1 to n do read(a[i]);readln;

j:=1;

while j<=n do begin

maX:=-maXlongint;

k:=0;

for i:=1 to n do

if not get[i] then begin

if s[i]<=tmp then begin

if a[i]>maX then begin

maX:=a[i];

k:=i;

end

end

else

if (s[i]-tmp)*2+a[i]>maX then begin

maX:=(s[i]-tmp)*2+a[i];

k:=i;

end;

end;

get[k]:=true;

inc(tot,maX);

writeln(tot);

if s[k]>tmp then tmp:=s[k];

inc(j);

end;

close(input);close(output);

end.

如果要拿到剩下的40分,主要有三种方法:

方法一:利用数据结构优化O(NlogN)

方法二:前缀和辅助O(NlogN,如果用O(N)排序就是O(N))

方法三:计数排序+穷举(时间复杂度O(N*1000)=10^8,刚好能过)

详细如下:

【方法一】需要优化选择下一个最优点的时间复杂度,有很多种方式(单调队列、堆、树状数组),这里我采用了树状数组维护区间最值的方法,建立两个树状数组,分别表示当前距离范围内的最大疲劳值、超过距离范围的(疲劳值+增加的往返距离值)最大值。

var

i,n,j,m,tmp,k1,k2,tot,maX1,maX2,tmp2:longint;

a,s,a2,s2,idX,idX2,idXid,idX2id,b:array[0..100000] of longint;

function lowbit(X:longint):longint;

begin

eXit(X and (-X));

end;

procedure update(i,X:longint);

var j:longint;

begin

j:=i;

while i<=n do begin

if idX[i]

idX[i]:=X;

idXid[i]:=j;

end;

inc(i,lowbit(i));

end;

end;

procedure update_desc(i,X:longint);//相当于逐个建立树状数组

var j:longint;

begin

j:=i;

while i<=n do begin

if idX2[i]

idX2[i]:=X;

idX2id[i]:=j;

end;

inc(i,lowbit(i));

end;

end;

procedure modify(p,n:longint);

var i,j:longint;

begin

i:=p;a[i]:=0;

while i<=n do begin

idX[i]:=a[i];idXid[i]:=i;

j:=1;

while j

if idX[i]

idX[i]:=idX[i-j];

idXid[i]:=idXid[i-j];

end;

j:=j shl 1;

end;

inc(i,lowbit(i));

end;

end;

function query(m:longint):longint;

begin

query:=0;

while m>0 do begin

if query

query:=idX[m];

k1:=idXid[m];

end;

dec(m,lowbit(m));

end;

end;

function query2(m:longint):longint;

begin

query2:=0;

while m>0 do begin

if query2

k2:=idX2id[m];

end;

dec(m,lowbit(m));

end;

end;

begin

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

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

readln(n);

for i:=1 to n do read(s[i]);readln;//距离数组

for i:=1 to n do read(a[i]);readln;//疲劳值数组

for i:=1 to n do s2[n+1-i]:=s[i];

for i:=1 to n do a2[n+1-i]:=a[i];

for i:=1 to n do update(i,a[i]);

for i:=1 to n do update_desc(i,s2[i]*2+a2[i]);

tmp:=n+1;

for i:=n downto 1 do //b[i]表示记录相同距离元素的最右边序号

if s[tmp]<>s[i] then begin

b[i]:=i;

tmp:=i;

end

else

b[i]:=tmp;

j:=1;m:=0;tmp:=0;

while j<=n do begin

maX1:=query(m);//前tmp个元素求最大值

maX2:=query2(n-m);//从tmp+1到n个元素中求算上距离的最大值

if maX1>maX2 then begin

inc(tot,maX1);

tmp2:=k1;

end

else begin

inc(tot,maX2);

m:=b[n+1-k2];

tmp:=n+1-k2;

tmp2:=n+1-k2;

end;

writeln(tot);

modify(tmp2,n);

inc(j);

end;

close(input);close(output);

end.

【方法二】前缀和

P[i]表示a数组中第i大的数的坐标,sum表示前缀和。

每一个答案都有两种可能来源:sum[i-1] +2*s[p[i]]+a[p[i]]+前i-1个或后i个中距离的最大值(maxs>s[i])或前i个之和+前i个中距离最大值*2(maxs

程序实现by 周骏东and 刘柏成

type aa=array[0..100000]of longint;

var

a,s,p,sum,b,c,m1,m2,f:aa;

n,i,j:longint;

function max(x,y:longint):longint;

begin

exit(x) else

exit(y);

end;

procedure qsort(l,r:longint); var

i,j,k,t,t1,t2:longint; begin

i:=l;j:=r;

k:=(i+j) div 2;

t:=a[k];

a[k]:=a[i];

t1:=p[k];p[k]:=p[i];

while i

begin

while (i

dec(j);

if i

begin

a[i]:=a[j];

p[i]:=p[j];

inc(i);

end;

while (it) do

inc(i);

if i

begin

a[j]:=a[i];

p[j]:=p[i];

dec(j);

end;

end;

p[i]:=t1;

if i-1>l then

qsort(l,i-1);

if i+1

qsort(i+1,r);

end;

begin

readln(n);

for i:=1 to n do

read(s[i]);

for i:=1 to n do

begin

read(a[i]);

p[i]:=i;

end;

b:=a;

qsort(1,n);

a:=b;//以a为标准,对p数组进行排序

sum[1]:=a[p[1]];

m1[1]:=p[1];

for i:=2 to n do

begin

sum[i]:=sum[i-1]+a[p[i]];

if s[m1[i-1]]>s[p[i]] then

m1[i]:=m1[i-1] else

m1[i]:=p[i];//m1[i]表示p[1]到p[i]中距离最大的值的坐标

end;

m2[n]:=p[n];

for i:=n-1 downto 1 do

begin

if 2*s[m2[i+1]]+a[m2[i+1]]>2*s[p[i]]+a[p[i]] then

m2[i]:=m2[i+1] else

m2[i]:=p[i];//m2[i]表示p[i]到p[n]中2*s[i]+a[i]最大值的坐标

end;

for i:=1 to n do

writeln(max(sum[i-1]+a[m2[i]]+max(s[m1[i-1]],s[m2[i]])*2,sum[i]+s[m1[i]]*2));

end.

【方法三】计数排序+穷举by王哲凡

注意题目的描述Si是有序的同时,值又是0~999的范围,因此可以先把Si计数排序,值作为下标存储在一个数组

然后每次选定下一个推销点时扫描0~999的范围,选一个值最大的,相同值中越靠右的一定是最优的(想想为什么)

#include

#include

#include

#include

#include

using namespace std;

int s[100009],a[100009],ans[100009],number[1001],q[1001][101];

int max(int x,int y)

{

if (x>y) return x;

else return y;

}

int init()

{

char ch;

ch=getchar();

while (ch<48||ch>57)

ch=getchar();

int sum=0;

while (ch>=48&&ch<=57)

{

sum=sum*10+ch-48;

ch=getchar();

}

return sum;

}

int main()

{

freopen("salesman.in","r",stdin);

freopen("salesman.out","w",stdout);

int n;

n=init();

for (int i=1;i<=n;i++)

{

s[i]=init();

}

for (int i=1;i<=n;i++)

{

a[i]=init();

number[a[i]]++;

q[a[i]][number[a[i]]]=i;

}

int _max=0;

int maxi=0;

for (int i=1;i<=n;i++)

{

_max=max(_max,s[i]*2+a[i]);

if (_max==s[i]*2+a[i]) maxi=i;

}

ans[1]=_max;

number[a[maxi]]--;

for (int i=2;i<=n;i++)

{

int x=0;

int y=0;

_max=0;

for (int j=1;j<=1000;j++)

{

if (number[j]>0)

if (q[j][number[j]]>maxi)

{

if (_max<2*s[q[j][number[j]]]-2*s[maxi]+j)

{

_max=2*s[q[j][number[j]]]-2*s[maxi]+j;

x=q[j][number[j]];

y=j;

}

}

else

{

if (_max

{

_max=j;

x=q[j][number[j]];

y=j;

}

}

}

maxi=max(maxi,x);

ans[i]=ans[i-1]+_max;

number[y]--;

}

for (int i=1;i<=n;i++)

{

printf("%d\n",ans[i]);

}

_fcloseall();

return 0;

}

NOIP2012提高组day1

CCF全国信息学奥林匹克联赛(NOIP2012)复赛 提高组 day1 (请选手务必仔细阅读本页内容) 注意事项: 1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。 3、全国统一评测时采用的机器配置为:CPU Intel Core2 Quad Q8200 2.33GHz, 内存2G,上 述时限以此配置为准。 4、特别提醒:评测在NOI Linux下进行。

1.Vigenère密码 (vigenere.cpp/c/pas) 【问题描述】 16世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码。Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用。 在密码学中,我们称需要加密的信息为明文,用M表示;称加密后的信息为密文,用C表示;而密钥是一种参数,是将明文转换为密文或将密文转换为明文的算法中输入的数据,记为k。在Vigenère密码中,密钥k是一个字母串,k=k1k2…k n。当明文M=m1m2…m n时,得到的密文C=c1c2…c n,其中c i=m i?k i,运算?的规则如下表所示: ? 【输入】 输入文件名为vigenere.in。 输入共2行。 第一行为一个字符串,表示密钥k,长度不超过100,其中仅包含大小写字母。第二行为一个字符串,表示经加密后的密文,长度不超过1000,其中仅包含大小写字母。

【输出】 输出文件名为vigenere.out。 输出共1行,一个字符串,表示输入密钥和密文所对应的明文。 对于100%的数据,输入的密钥的长度不超过100,输入的密文的长度不超过1000,且都仅包含英文字母。 2.国王游戏 (game.cpp/c/pas) 【问题描述】 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这n位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。 国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。注意,国王的位置始终在队伍的最前面。 【输入】 输入文件为game.in。 第一行包含一个整数n,表示大臣的人数。 第二行包含两个整数a和b,之间用一个空格隔开,分别表示国王左手和右手上的整数。 接下来n行,每行包含两个整数a和b,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。 【输出】 输出文件名为game.out。 输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。

2012普及组初赛试题与答案

第十八届全国青少年信息学奥林匹克联赛初赛 普及组 C 语言试题 竞赛时间:2012 年 10 月 13 日 14:30~16:30 选手注意: ●试题纸共有 10 页,答题纸共有 2 页,满分 100 分。请在答题纸上作答,写在试题纸上 的一律无效。 ●不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。 一、单项选择题(共20 题,每题1.5 分,共计30 分;每题有且仅有一个正确选项) 1. 计算机如果缺少(),将无法正常启动。 A. 内存 B. 鼠标 C. U 盘 D. 摄像头 2. ()是一种先进先出的线性表。 A. 栈 B. 队列 C. 哈希表(散列表) D. 二叉树 3. 目前计算机芯片(集成电路)制造的主要原料是(),它是一种可以在沙子中提炼 出的物质。 A. 硅 B. 铜 C. 锗 D. 铝 4. 十六进制数9A在()进制下是232。 A. 四 B. 八 C. 十 D. 十二 5. ()不属于操作系统。 A. Windows B. DOS C. PhotoShop D. NOI Linux 6. 如果一棵二叉树的中序遍历是BAC,那么它的先序遍历不可能是()。 A. ABC B. CBA C. ACB D. BAC 7. 目前个人电脑的()市场占有率最靠前的厂商包括 Intel、AMD 等公司。 A. 显示器 B. CPU C. 内存 D. 鼠标

8. 使用冒泡排序对序列进行升序排序,每执行一次交换操作将会减少 1 个逆序对,因此序 列 5, 4, 3, 2, 1 需要执行()次交换操作,才能完成冒泡排序。 A. 0 B. 5 C. 10 D. 15 9. 1946 年诞生于美国宾夕法尼亚大学的 ENIAC 属于()计算机。 A. 电子管 B. 晶体管 C. 集成电路 D. 超大规模集成电路 10. 无论是 TCP/IP 模型还是 OSI 模型,都可以视为网络的分层模型,每个网络协议都会被 归入某一层中。如果用现实生活中的例子来比喻这些“层”,以下最恰当的是()。A. 中国公司的经理与斯里兰卡公司的经理交互商业文件 第 4 层中国公司经理斯里兰卡公司经理 ↑↓↑↓ 第 3 层中国公司经理秘书斯里兰卡公司经理秘书 ↑↓↑↓ 第 2 层中国公司翻译斯里兰卡公司翻译 ↑↓↑↓ 第 1 层中国邮递员←→斯里兰卡邮递员 B. 军队发布命令 第 4 层司令 ↓ 第 3 层军长 1 军长 2 ↓↓ 第 2 层师长 1 师长 2 师长 3 师长 4 ↓↓↓↓第 1 层团长 1 团长 2 团长 3 团长 4 团长 5 团长 6 团长 7 团长 8

NOIP2012普及组复赛解题报告c++版本

信息学奥赛NOIP2012普及组解题报告(c++版本) 第一题质因数分解, 题目已知正整数n是两个不同的质数的乘积, 试求出较大的那个质数, 没什么技术含量, 直接开个根号搜一遍就好了. 另外不开根号会TLE导致得60分. 1 #include 2 #include 3int main() 4 { 5int n; 6scanf("%d", &n); 7for (int i = 2, k = sqrt(n) + 1; i < k; ++i) 8if (n % i == 0) 9{ 10printf("%d\n", n / i); 11break; 12} 13return0; 14 } 第二题寻宝 [题目]传说很遥远的藏宝楼顶层藏着诱人的宝藏。小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书。说明书的内容如下:藏宝楼共有N+1层,最上面一层是顶层,顶层有一个房间里面藏着宝藏。除了顶层外,藏宝楼另有N层,每层M个房间,这M个房间围成一圈并按逆时针方向依次编号为0,…,M-1。其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同。每个房间里有一个指示牌,指示牌上有一个数字x,表示从这个房间开始按逆时针方向选择第x个有楼梯的房间(假定该房间的编号为k),从该房间上楼,上楼后到达上一层的k号房间。比如当前房间的指示牌上写着2,则按逆时针方向开始尝试,找到第2个有楼梯的房间,从该房间上楼。如果当前房间本身就有楼梯通向上层,该房间作为第一个有楼梯的房间。寻宝说明书的最后用红色大号字体写着:“寻宝须知:帮助你找到每层上楼房间的指示牌上的数字(即每层第一个进入的房间内指示牌上的数字)总和为打开宝箱的密钥”。请帮助小明算出这个打开宝箱的密钥。 这个题是个简单的模拟, 但是出乎意料的恶心, 当年做这个题的时候爆零, 钛蒻了, 总感觉这个比第三题难. 1 #include 2int x[10003][103], fjx[103]; 3bool k[10003][103]; 4int main()

NOIP普及组初赛历年试题及答案选择题篇

NOIP普及组初赛历年试题及答案选择题篇 单项选择题:每次共20题,每题1.5分,共计30分。每题有且仅有一个正确选项。注:答案在文末 一、计算机基础(每年8-10题,占选择题的一半,找份材料翻几遍就可拿分了) NOIP2011-3. 一片容量为8G的SD卡能储存大约( )张大小为2MB的数码照片。 A.1600 B.2000 C.4000 D.16000 NOIP2011-4. 摩尔定律(Moore'slaw)是由英特尔创始人之一戈登·摩尔(GordonMoor)提出来的。根据摩尔定律,在过去几十年一级在可预测的未来纪念,单块集成电路的集成度大约每( )个月翻一番。 A.1 B.6 C.18 D.36 NOIP2011-6.寄存器是( )的重要组成部分。 A.硬盘 B.高速缓存 C.内存 D.中央处理器(CPU) NOIP2011-10. 有人认为,在个人电脑送修前,将文件放入回收站中就是已经将其删除了。这种想法是( )。 A .正确的,将文件放入回收站以为着彻底删除、无法恢复 B.不正确的,只有将回收站清空后,才意味着彻底删除、无法恢复 C.不正确的,即使回收站清空,文件只是被标记为删除,仍可能通过回复软件找回 D.不正确的,只要在硬盘上出现过的文件,永远不可能被彻底删除 NOIP2011-14. 生物特征识别,是利用人体本身的生物特征进行身份认证的一种技术。目前,指纹识别、虹膜识别、人脸识别等技术已广泛应用于政府、银行、安全防卫等领域。以下不属于生物特征识别技术及其应用的是( )。

NOIP2011-16. 关于汇编语言,下列说法错误的是( )。 A.是一种与具体硬件相关的程序设计语言 B.在编写复杂程序时,相对于高级语言而言代码量较大,且不易调试 C.可以直接访问寄存器、内存单元、以及I/O端口 D.随着高级语言的诞生,如今已完全被淘汰,不再使用 NOIP2011-18. 1956年( )授予肖克利、巴丁和布拉顿,以表彰他们对半导体的研究和晶体管效应的发现。 A.诺贝尔物理学奖 B.约翰·冯·诺依曼奖 C.图灵奖 D.高德纳奖 NOIP2011-20. 从ENIAC到当前最先进的计算机,冯·诺依曼体系结构始终占有重要地位。冯诺依曼体系结构的核心内容是( )。 A.采用开关电路 B.采用半导体器件 C.采用存储程序和程序控制原理 D.采用键盘输入 NOIP2012-1. 计算机如果缺少( ),将无法正常启动。 A.内存 B.鼠标 C.U盘 D.摄像头

NOIP普及组初赛历年试题及标准答案选择题篇

NOIP普及组初赛历年试题及答案选择题篇

————————————————————————————————作者:————————————————————————————————日期:

NOIP普及组初赛历年试题及答案选择题篇 单项选择题:每次共20题,每题1.5分,共计30分。每题有且仅有一个正确选项。注:答案在文末 一、计算机基础(每年8-10题,占选择题的一半,找份材料翻几遍就可拿分了) NOIP2011-3. 一片容量为8G的SD卡能储存大约( )张大小为2MB的数码照片。 A.1600 B.2000 C.4000 D.16000 NOIP2011-4. 摩尔定律(Moore'slaw)是由英特尔创始人之一戈登·摩尔(GordonMoor)提出来的。根据摩尔定律,在过去几十年一级在可预测的未来纪念,单块集成电路的集成度大约每( )个月翻一番。 A.1 B.6 C.18 D.36 NOIP2011-6.寄存器是( )的重要组成部分。 A.硬盘 B.高速缓存 C.内存 D.中央处理器(CPU) NOIP2011-10. 有人认为,在个人电脑送修前,将文件放入回收站中就是已经将其删除了。这种想法是( )。 A .正确的,将文件放入回收站以为着彻底删除、无法恢复 B.不正确的,只有将回收站清空后,才意味着彻底删除、无法恢复 C.不正确的,即使回收站清空,文件只是被标记为删除,仍可能通过回复软件找回 D.不正确的,只要在硬盘上出现过的文件,永远不可能被彻底删除

NOIP2011-14. 生物特征识别,是利用人体本身的生物特征进行身份认证的一种技术。目前,指纹识别、虹膜识别、人脸识别等技术已广泛应用于政府、银行、安全防卫等领域。以下不属于生物特征识别技术及其应用的是( )。 NOIP2011-16. 关于汇编语言,下列说法错误的是( )。 A.是一种与具体硬件相关的程序设计语言 B.在编写复杂程序时,相对于高级语言而言代码量较大,且不易调试 C.可以直接访问寄存器、内存单元、以及I/O端口 D.随着高级语言的诞生,如今已完全被淘汰,不再使用 NOIP2011-18. 1956年( )授予肖克利、巴丁和布拉顿,以表彰他们对半导体的研究和晶体管效应的发现。 A.诺贝尔物理学奖 B.约翰·冯·诺依曼奖 C.图灵奖 D.高德纳奖 NOIP2011-20. 从ENIAC到当前最先进的计算机,冯·诺依曼体系结构始终占有重要地位。冯诺依曼体系结构的核心内容是( )。 A.采用开关电路 B.采用半导体器件 C.采用存储程序和程序控制原理 D.采用键盘输入

noip2017普及组初赛试题+答案

第23届全国青少年信息学奥林匹克联赛初赛 普及组C++语言试题 竞赛时间:2017年10 月14 日14:30~16:30 选手注意: 1、试题纸共有8 页,答题纸共有2 页,满分100 分。请在答题纸上作答,写在试题纸上的一律无效。 2、不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料。 一、单项选择题(共20题,每题1.5分,共计30分;每题有且仅有一个正确选项) 1.在 8 位二进制补码中,10101011 表示的数是十进制下的( )。 A. 43 B. -85 C. -43 D. -84 解析:补码就是符号位不变,其他各位逐位求反再加一 结论:-85 答案B 2.计算机存储数据的基本单位是( )。 A. bit B. Byte C. GB D. KB 3.下列协议中与电子邮件无关的是( )。 A. POP3 B. SMTP C. WTO D. IMAP 4.分辨率为 800x600、16 位色的位图,存储图像信息所需的空间为( )。 A.937.5KB B. 4218.75KB C.4320KB D. 2880KB 解析:800*600*16/8=A 5.计算机应用的最早领域是( )。 A. 数值计算 B. 人工智能 C. 机器人 D. 过程控制 6.下列不属于面向对象程序设计语言的是( )。 A. C B. C++ C. Java D. C# 解析:新出的语言都是面向对象的,OOP的,旧的不是,答案A 7.NOI 的中文意思是( )。 A. 中国信息学联赛 B. 全国青少年信息学奥林匹克竞赛 C. 中国青少年信息学奥林匹克竞赛 D. 中国计算机协会 解析:全国青少年信息学奥林匹克竞赛 答案:B 8. 2017年10月1日是星期日,1999年10月1日是( )。 A. 星期三 B. 星期日

NOIP2012复赛普及组精彩试题

实用文档 CCF全国信息学奥林匹克联赛(NOIP2012)复赛 普及组 (请选手务必仔细阅读本页内容)

实用文档 四.运行内存限制 内存上限128M 128M 128M 128M 注意事项: 1、文件名(程序名和输入输出文件名)必须使用英文小写。 2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。 3、全国统一评测时采用的机器配置为:CPU Intel Core2 Quad Q8200 2.33GHz,内存2G,上述时限以此配置为准。 4、特别提醒:评测在NOI Linux 下进行。 1.质因数分解 (prime.cpp/c/pas) n是两个不同的质数的乘积,试求出较大的那个质数。【问题描述】已知正整数 【输入】 输入文件名为prime.in。 输入只有一行,包含一个正整数n。 【输出】 输出文件名为prime.out。 p,即较大的那个质数。输出只有一行,包含一个正整数 【输入输出样例】

【数据范围】n ≤。10006 对于60%的数据,≤9n 100%对于的数据,6 ≤≤2*10。 2.寻宝 (treasure.cpp/c/pas) 【问题描述】传说很遥远的藏宝楼顶层藏着诱人的宝藏。小明历尽千辛万苦终于找到传说中的这个藏宝楼,藏宝楼的门口竖着一个木板,上面写有几个大字:寻宝说明书。说明书的内容如下: 实用文档 藏宝楼共有N+1 层,最上面一层是顶层,顶层有一个房间里面藏着宝藏。除了顶层外,藏宝楼另有N 层,每层M 个房间,这M 个房间围成一圈并按逆时针方向依次编号为0,…, M-1。其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同。每个房间里有一个指示牌,指示牌上有一个数字x,表示从这个房间开始按逆时针方向选择第x 个有楼梯的房间(假定该房间的编号为k),从该房间上楼,上楼后到达上一层的k 号房间。比如当前房间的指示牌上写着2,则按逆时针方向开始尝试,找到第2 个有楼梯的房间,从该房间上楼。如果当前房间本身就有楼梯通向上层,该房间作为第一个有楼梯的房间。 寻宝说明书的最后用红色大号字体写着:“寻宝须知:帮助你找到每层上楼房间的指示牌上的数字(即每层第一个进入的房间内指示牌上的数字)总和为打开宝箱的密钥”。 请帮助小明算出这个打开宝箱的密钥。 【输入】 输入文件为treasure.in。 第一行2 个整数N 和M,之间用一个空格隔开。N 表示除了顶层外藏宝楼共N 层楼, M 表示除顶层外每层楼有M 个房间。 接下来N*M 行,每行两个整数,之间用一个空格隔开,每行描述一个房间内的情况,其中第(i-1)*M+j 行表示第i 层j-1 号房间的情况(i=1, 2, …, N;j=1, 2, …,M)。第一个整数表示该房间是否有楼梯通往上一层(0 表示没有,1 表示有),第二个整数表示指示牌上的数字。注意,从j 号房间的楼梯爬到上一层到达的房间一定也是j 号房间。 最后一行,一个整数,表示小明从藏宝楼底层的几号房间进入开始寻宝(注:房间编号从0 开始)。 【输出】 输出文件名为treasure.out。 输出只有一行,一个整数,表示打开宝箱的密钥,这个数可能会很大,请输出对20123 取模的结果即可。 【输入输出样例】

NOIP2016初赛普及组C++题目及答案

第二十二届全国青少年信息学奥林匹克联赛初赛 普及组 语言试题 竞赛时间:2016 年 10 月 22 日 14:30~16:30 选手注意: ● 试题纸共有 9 页,答题纸共有 2 页,满分 100 分。请在答题纸上作答,写在 试题纸上的一律无效。 ● 不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资 料。 一、单项选择题(共 20 题,每题 1.5 分,共计 30 分;每题有且仅有一个正确选 项) 1. 以下不是微软公司出品的软件是( )。 A. B. C. D. 2. 如果 256 种颜色用二进制编码来表示,至少需要( )位。 A. 6 B. 7 C. 8 D. 9 3. 以下不属于无线通信技术的是( )。 A. 蓝牙 B. C. D. 以太网 4. 以下不是 生产厂商的是( )。 D. A. B. C. 5. 以下不是存储设备的是( )。 D. 鼠标 A. 光盘 B. 磁盘 C. 固态硬盘 6. 如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照、 字母键 A 、字母键 S 和字母键 D 的顺序循环按键,即 、A 、S 、D 、 、A 、S 、D 、……,屏幕上输出的第 81 个字符是字母( )。 A. A B. S C. D D. a 7. 二进制数 00101100 和 00010101 的和是( )。 A. B. 01000001 C. D. 8. 与二进制小数 0.1 相等的八进制数是( )。 D. 0.1 A. 0.8 B. 0.4 C. 0.2 2016 初赛普及组 语言试题 第 1 页,共 9 页

NOIP2012普及组初赛试题和参考答案

NOIP2012普及组初赛试题和参考答案 发表时间:2012-11-2 8:38:59来源: 第十八届全国青少年信息学奥林匹克联赛初赛 (普及组Pascal语言试题) 竞赛时间:2012年10月13日14:30~16:30 选手注意: ●试题纸共有10页,答题纸共有2页,满分100分。请在答题纸上作答,写在试题纸上一律无效。 ●不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资料 一、单项选择题(共20题,每题1.5分,共计30分;每题且仅有一个正确选项) 1.计算机如果缺少(),将无法正常启动。 A.内存B.鼠标C.U盘D.摄像头 2.()是一种先进先出的线性表。 A.栈B.队列C.哈希表(散列表) D.二叉树 3.目前计算机芯片(集成电路)制造的主要原料是(),它是一种可以在沙子中提炼出的物质。 A.硅B.铜C.锗D.铝 4.十六进制数9A在()进制下是232。 A.四B.八C.十D.十二 5.()不属于操作系统。 A.Windows B.DOS C.Photoshop D.NOI Linux 6.如果一棵二叉树的中序遍历是BAC,那么它的先序遍历不可能是()。 A.ABC B.CBA C.ACB D.BAC

7.目前个人电脑的()市场占有率最靠前的厂商包括Intel、AMD等公司。 A.显示器B.CPU C.内存D.鼠标 8.使用冒泡排序对序列进行升序排列,每执行一次交换操作系统将会减少1个逆序对,因此序列5,4,3,2,1需要执行()次操作,才能完成冒泡排序。 A.0 B.5 C.10 D.15 9.1946年诞生于美国宾夕法尼亚大学的ENIAC属于()计算机。 A.电子管B.晶体管C.集成电路D.超大规模集成电路 10.无论是TCP/IP模型还是OSI模型,都可以视为网络的分层模型,每个网络协议都会被归入某一层中。如果用现实生活中的例子来比喻这些“层”,以下最恰当的是()。 A.中国公司的经理与波兰公司的经理交互商业文件 C.国际会议中,每个人都与他国地位对等的人直接进行会谈

NOIP2012普及组模拟试题 有解析

冲刺CCF NOIP2012模拟试题与解析(普及组) 1.上学路线(route.pas/c/cpp) 【题目描述】 你所在城市的街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道。南北方向的a条街道从西到东依次编号为l到a,而东西方向的b条街道从南到北依次编号为l到b,南北方向的街道i和东西方向的街道j的交点记为(i,j)。 你住在(1,1)处,而学校在(a,b)处,你骑自行车去上学,自行车只能沿着街道走,而且为了缩短时间只允许沿着向东和北的方向行驶。 现在有N个交叉路口在施工(X1,Yl)、(X2,Y2)……,(Xn,Yn),这些路口是不能通车的。 问你上学一共有多少走法? 【输入格式】 第一行包含两个整数a和b,并且满足1≤a,b≤16。 第二行包含一个整数N,表示有N个路口在维修(1≤N≤40)。 接下来N行,每行两个整数X_i,Y_i,描述路口的位置。 【输出格式】 输出一个整数表示从(1,1)到(a,b)的行车路线总数。

【样例数据解释】 JOI High School (5,4) (1,1) Taro’s Home

2.遗址(ruin.pas/c/cpp) 【题目描述】 很久很久以前有一座寺庙,从上往下看寺庙的形状正好是一个正方形,由4个角上竖立的圆柱搭建而成。现在圆柱都倒塌了,只在地上留下圆形的痕迹,可是现在地上有很多这样的痕迹,专家说一定是最大的那个。 写一个程序,给出圆柱的坐标,找出由4个圆柱构成的最大的正方形,因为这就是寺庙的位置,要求计算出最大的面积。注意正方形的边不一定平行于坐标轴。 例如右上图有l0根柱子,其中(4,2),(5,2),(5,3),(4,3)可以形成一个正方形,(1,1),(4,O),(5,3),(2,4)也可以,后者是其中最大的,面积为l0。 【输入格式】 第一行包含一个N(1≤N≤3 0 0 0),表示柱子的数量。 接下来N行,每行有两个空格隔开的整数表示柱子的坐标(坐标值在0到5000之间),柱子的位置互不相同。 【输出格式】 如果存在正方形,输出最大的面积,否则输出0。

NOIP普及组初赛历年试题及答案阅读题篇

NOIP普及组初赛历年试题及答案阅读题篇 阅读程序写结果(共4 题,每题8 分,共计32 分) 阅读程序题是得分的关键,因为不是让你上机去运行程序,所以要一步步地读程序,记录相关变量值的变化情况。因为程序的运行结果只有输出语句才有输出,所以只写出输出语句的结果。有时要找出规律才能写出结果,特别是循环次数多的情况,另外要注意边界值,不能多算一步也不能少算一步。 解决这类问题的关键在于能够分析程序的结构以及程序段的功能。常见的有列表法、画流程图法等。完成这类题目的方法和步骤如下: 1、从头到尾通读程序,大致把握程序的算法、找出这个题目的即这个程序想干什么。抓住了它,不仅得出答案变得较容易,而且对自己的结果也会比较有信心。 2、通过给程序分段、理清程序的结构和层次,达到读懂程序的目的。 3、阅读程序中特别注意跟踪主要变量的值的变化,可以用列表的方法,了解变量变化和程序的运行结果,注意发现规律。所谓列表法,就是将各变量名作为表头,在程序的执行过程中,将各变量值的变化记录在相应变量的下方。 4、按照程序中输出格式的要求,写出运行结果,并带着结果回到程序进行检查。 在阅读程序时,要特别注意过程、函数所完成的子任务以及和主程序之间的参数传递关系。在阅读程序中,比较好的方法是首先阅读主程序,看其需要调用的过程或函数是什么,最后要求输出变量是什么;其次在阅读程序中,将较长的程序分成几个程序段(特别注意循环结构、判断结构),阅读理解各程序段的功能以及各程序之间的关联。 NOIP2011-1. #include using namespace std; int main() {

相关文档
最新文档