求2023年NOIP普及組複賽試題

2022-01-03 06:55:19 字數 6037 閱讀 4687

1樓:匿名使用者

一、isbn號碼

基礎字串處理題,心細一點的基本都能得滿分。

參考程式:

program isbn;

const

inp='isbn.in';

oup='isbn.out';

vari,j,k,ans:longint;

s:string;

ch:char;

procedure flink;

begin

assign(input,inp);

reset(input);

assign(output,oup);

rewrite(output);

end;

procedure fclose;

begin

close(input);

close(output);

end;

begin

flink;

readln(s);// 輸入字串

j:=0;

i:=1;

ans:=0;

while j<9 do

begin

if s[i] in ['0'..'9'] then//如果是數字,那麼累加到ans中,共9個數字

begin

inc(j);

inc(ans,(ord(s[i])-ord('0'))*j);

end;

inc(i);

end;

ans:=ans mod 11;計算識別碼

if ans=10 then ch:='x' else ch:=chr(ord('0')+ans);//把識別碼轉換成字元,方便輸出

if s[length(s)]=ch

then write('right')

else write(copy(s,1,12)+ch);//輸出正確的識別碼

fclose;

end.

二、排座椅

用的是賽前集訓時提到的貪心,當時說某些題目用貪心可以得部分分,但是本題貪心可以得滿分的。

當然本題的貪心需要預處理下,開2個一維陣列,row[i]錄如果在第i行加通道,可以分割多少對調皮學生,col[i]記錄如果在第j列加通道,可以分割多少對調皮學生,最後貪心法輸出分割學生最多的前k行和前l列。

參考程式:

program seat;

const

inp='seat.in';

oup='seat.out';

varflag,m,n,k,l,d,i,j,x,y,x1,y1:longint;

tmp,col,row:array[1..1000] of longint;

s,s1:ansistring;

procedure flink;

begin

assign(input,inp);

reset(input);

assign(output,oup);

rewrite(output);

end;

procedure fclose;

begin

close(input);

close(output);

end;

function min(a,b:longint):longint;

begin

if a

end;

procedure qsort(m,n:longint);//快排

vari,j,k,t:longint;

begin

i:=m; j:=n; k:=tmp[(i+j) shr 1];

repeat

while tmp[i]>k do inc(i);

while tmp[j]j;

if m0 then

begin

inc(j);

tmp[j]:=row[i];

end;

end;

qsort(1,j);//對tmp陣列排序

flag:=tmp[k];//flag為前k項的最小值

i:=1; j:=0;

while (i<=n) and (j=flag then //如果該行能分割的人數不少於flag,說明此處可以新增通道

begin

write(i);

inc(j);

if j<>k then write(' ');

end;

inc(i);

end;

writeln;

//下面是求列通道,思想同上

j:=0;

for i:= 1 to n do

begin

if col[i]>0 then

begin

inc(j);

tmp[j]:=col[i];

end;

end;

qsort(1,j);

flag:=tmp[l];

i:=1; j:=0;

while (i<=m) and (j=flag then

begin

write(i);

inc(j);

if j<>l then write(' ');

end;

inc(i);

end;

fclose;

end.

三、傳球遊戲

直接dp,似乎說遞推更確切點。

f(i,k)表示經過k次傳到編號為i的人手中的方案數。那麼可以推出下面的方程:

f(i,k)=f(i-1,k-1)+f(i+1,k-1) (i=1或n時,需單獨處理)

邊界條件:f(1,0)=1;

結果在f(1,m)中

參考程式:

program ball;

const

inp='ball.in';

oup='ball.out';

vari,j,k,n,m:longint;

f:array[0..30,0..30] of longint;

procedure flink;

begin

assign(input,inp);

reset(input);

assign(output,oup);

rewrite(output);

end;

procedure fclose;

begin

close(input);

close(output);

end;

begin

flink;

readln(n,m);

fillchar(f,sizeof(f),0);

f[1,0]:=1;

for k:=1 to m do//注意此處2個迴圈的次序

begin

f[1,k]:=f[2,k-1]+f[n,k-1];

for i:= 2 to n-1 do

f[i,k]:=f[i-1,k-1]+f[i+1,k-1];

f[n,k]:=f[n-1,k-1]+f[1,k-1];

end;

write(f[1,m]);

fclose;

end.

四、立體圖

pku原題,編號2330

算不上難題,但是比較麻煩,細心點就ok了。

先計算好畫布的大小,再寫一個根據左下角座標繪製一個單位立方體的子程式。

然後遵循下面法則,不停繪製若干個立方體。(此處能體現出分割程式的偉大)

因為要不停的覆蓋,所以要遵循「視覺法則」:

1. 先繪里層再繪外層

2. 先繪底層再繪上層

3. 先回左邊再繪右邊

參考程式:

program drawing;

const

inp='drawing.in';

oup='drawing.out';

varm,n,i,j,k,x,y,h,tmp,maxx,maxy:longint;

map:array[1..1000,1..1000] of char;//畫布

a:array[1..50,1..50] of integer;//記錄輸入的矩陣

procedure flink;

begin

assign(input,inp);

reset(input);

assign(output,oup);

rewrite(output);

end;

procedure fclose;

begin

close(input);

close(output);

end;

procedure print;//輸出畫布

vari,j:longint;

begin

for i:= 1 to maxx do

begin

for j:= 1 to maxy do

write(map[i,j]);

if i<>maxx then writeln;

end;

end;

procedure draw(x,y:longint);//在畫布(map陣列)上繪製左下角座標為(x,y)的一個單位立方體

begin

map[x,y]:='+';map[x,y+1]:='-'; map[x,y+2]:='-';map[x,y+3]:='-';map[x,y+4]:='+';

dec(x);

map[x,y]:='|';map[x,y+1]:=' '; map[x,y+2]:=' ';map[x,y+3]:=' ';map[x,y+4]:='|';

map[x,y+5]:='/';

dec(x);

map[x,y]:='|';map[x,y+1]:=' '; map[x,y+2]:=' ';map[x,y+3]:=' ';map[x,y+4]:='|';

map[x,y+5]:=' ';map[x,y+6]:='+';

dec(x);

map[x,y]:='+';map[x,y+1]:='-'; map[x,y+2]:='-';map[x,y+3]:='-';map[x,y+4]:='+';

map[x,y+5]:=' ';map[x,y+6]:='|';

dec(x); inc(y);

map[x,y]:='/';map[x,y+1]:=' '; map[x,y+2]:=' ';map[x,y+3]:=' ';map[x,y+4]:='/';

map[x,y+5]:='|';

dec(x);inc(y);

map[x,y]:='+';map[x,y+1]:='-'; begin

link;

for i:= 1 to 1000 do

for j:= 1 to 1000 do

map[i,j]:='.'; //初始化畫布

readln(m,n);

//計算畫布大小maxx * maxy

maxy:=n*4+1+m*2;

maxx:=0;

for i:= 1 to m do

begin

tmp:=0;

for j:= 1 to n do

begin

read(a[i,j]);

if a[i,j]>tmp then tmp:=a[i,j];

end;

tmp:=tmp*3+3+(m-i)*2;

if tmp >maxx then maxx:=tmp;

readln;

end;

//開始往畫布上繪圖

for i:= 1 to m do

for j:= 1 to n do

begin

x:=maxx-(m-i)*2;//第i層第j列最下方立方體左下角點的位置(x,y)

y:=(m-i)*2+(j-1)*4+1;

for k:= 1 to a[i,j] do

draw(x-(k-1)*3,y);//繪製每層的若干個一個單位立方體

end;

print;//輸出畫布

fclose;

end.

問一道2023年初中化學複賽題,問一道2023年初中化學複賽題

d吧,對比實驗只能有一個變數,使褪色後兩個滴管滴出多的那個維生素 c含量多,所以不用控制 在其它三個條件一樣的情況下,用少量果汁就使溶液褪色的說明vc多,其它幾個必須一樣,不一樣就不是對比實驗了.就這樣了,再說也說不清了 a b c d中的一個 ddddddddddddd 我做過的 而且我有答案 說...

2023年組裝電腦配置單,2023年組裝電腦配置單

配置 品牌 型號 數量 北京 cpu intel 奔騰 g620 盒 360主機板 精英h61h2 mv dvi 1 299記憶體 威剛1gb ddr3 1333 萬 53x2硬碟 wd 500gb 7200轉 16mb s 335顯示卡 盈通鐳龍r6670 1024gd5 499機箱 辛巴達大河馬...

2023年遊戲王上位卡組有那些,怎麼組

1 目前就是十二獸,還有十二獸的各種衍生卡組。2 比較穩定的就是星茲 毫無疑問的大佬 3 帝 去年六月的上位之一 目前來看可能比不過星茲 4 壞獸 相對不穩定,重點在於吃怪防不勝防,作為外掛也是相當優秀的 5 青眼 同帝 獄火機 現在可以作為外掛,額外基本只出提耶拉所以link不會影響 6 真龍說實...