NOIP提高组复赛试题解题报告Word文档下载推荐.docx
- 文档编号:17403145
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:14
- 大小:28.62KB
NOIP提高组复赛试题解题报告Word文档下载推荐.docx
《NOIP提高组复赛试题解题报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《NOIP提高组复赛试题解题报告Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
Home0v
fU7A;
w_z+g.b_w_L
ans:
array[1..maxn1]ofnums;
9r_U5?
H_D0i,j,k,n:
Home_H5I!
V_M_ps_X_@
f1,f2:
text;
Home_W!
G%`_@_z1v_agQ
procedureranqsort(varnum:
low,high:
longint);
Home-I__1Y"
V_T_e_@W_|'
^_^
varOlympiadinInformaticsBeginners'
Home_S/L:
i`_i#[
i,j,k,tmp,x:
Home9dA__~'
a:
J)D\_x_`_
begin
u&
C0EL"
MM"
R6w0whilelow<
highdobeginOlympiadinInformaticsBeginners'
z_wd,Xu(Q_y
i:
=low-1;
_MO_{1j!
f'
~3E0k:
=random(high-low+1)+low;
Home_j{K_VT
tmp:
=num[k];
num[k]:
=num[high];
num[high]:
=tmp;
Home!
T(S4e_@_S
x:
Home_t1D_?
@:
z_O$h
forj:
=lowtohigh-1doifnum[j]<
=xthen
P_b_y)B&
t0beginOlympiadinInformaticsBeginners'
Home:
y_J_oZ_S_j-H5]4e
inc(i);
HomeO,r'
o_G,Y'
u-^__$Q
=num[i];
num[i]:
=num[j];
num[j]:
x&
N:
U_m;
`7|8q_\
Home(n6d_u_qHp_O:
a
=num[i+1];
num[i+1]:
_K%O'
H_f*f%r_V0C0ranqsort(num,low,i);
8V6O/e_m_f5i+P_w1t0low:
=i+2;
Home#e3g_D?
_m.h%?
4n
__4m_G2C4^-B0end;
Home*F,X({e&
R2W
beginOlympiadinInformaticsBeginners'
Home3A_Y_m!
J_^5l#cm
fillchar(num,sizeof(num),0);
Home_?
_f8K_P_g_t-A
fillchar(ans,sizeof(ans),0);
`0u_F.f_d_b0assign(f1,'
count.in'
);
reset(f1);
_q;
k_|)zm_|0assign(f2,'
count.out'
rewrite(f2);
Home9\_q_}
Q_n_V_X
readln(f1,n);
9O%H_@c.p5o_es0fori:
=1tondoreadln(f1,num[i]);
Home_O;
B[d
\}9d6U3P
close(f1);
Home5u9o&
e(T_Z_n
randomize;
(i_\_G_?
;
~_f0ranqsort(num,1,n);
Home_j.h_i4sk(Z.x_v
j:
=1;
ans[1].numb:
=num[1];
ans[1].time:
'
I$O_x%Y_u_O_l0fori:
=2tondoifnum[i]=ans[j].numbtheninc(ans[j].time)OlympiadinInformaticsBeginners'
Home_^"
T-R
|_~_@_|_V
elsebegininc(j);
ans[j].numb:
ans[j].time:
end;
&
t#[*p5J_i_}_Y_^_^_E0fori:
=1tojdowriteln(f2,ans[i].numb,'
'
ans[i].time);
_L;
r!
R_j_M_K_a0close(f2);
Home_W__Sb0~
end.
_^8j_^_K9G7v_Z_r6UOL0二、字符串的展开OlympiadinInformaticsBeginners'
Home+Cx*_y_K'
h_H
_
这道题是全卷思路最简单的一道题,简单模拟即可,但是这一点恰恰是这道题目的难点,因为字符串处理的题目对编程熟练程度要求比较高,而且这题还要考虑好多种因素,比如说有可能字符串开头出现了“-”号,结果不少人当时就因此有一个点WA的WA,崩溃的崩溃。
另外,这题展开的字符串长度有可能超过255,也就是string的最大长度,所以当时也不少人没考虑到这点而超过长度,就这样WA了。
所以这题正确的解法应该这样,有两种处理方法,要么你用数组来处理,要么就用ansistring(动态内存,最大2G)。
数组处理不方便,推荐程序实现能力强的大牛使用,而ansistring,编程相对简单,操作和普通的string是完全一样的,实用性强,推荐使用!
我当时就是这么做的,好了,思路点到此,接下来看代码:
2q)S6Oz5Y_o9b_D_Z0[参考程序]
_}6U*\_N_wa0programexpand;
Home'
L!
f_`9U)y_B_g"
O_l
0L3~'
nr_cz"
b0intype=recordOlympiadinInformaticsBeginners'
G,i_M_\_Q_K
pst:
word;
]_e_u&
m?
2b_X$c_E_}_Q0data:
ansistring;
{这里是重点}
c_]9k_g_Q_f0end;
Home_N*Q_n_U_V_L_\_c_R
Home_i/x_Y_VH_`_r_L_o_V
s1,s2:
Home5hU_f_^_U2A_i_x8__X;
S
tmp1,tmp2,j:
char;
_V_J#[_B;
N-l:
n_JH0i,k,mus,l,p1,p2,p3,x,y,asc,m,len:
Home4l_h_g4@_{-q
site:
array[1..65536]oflongint;
Home_k;
J_?
5ub_?
_UV(K
X_B_T_U
dele:
array[1..65536]ofboolean;
Home%k_b"
x_b_R9E7x_`
inch:
array[1..65536]ofintype;
_L'
z_r"
rI_H_`({_^-Z0sa1,sa2,sa3:
boolean;
)T_B9h%N.`0f1,f2:
Home&
V6H;
p4m_h([_r6E_S
_z_pj_I2Q.@2B0assign(f1,'
expand.in'
_V5g_S3Q:
o!
m0assign(f2,'
expand.out'
Home;
T_l_x_i#i_K_V
fillchar(site,sizeof(site),0);
_R%J_D8}Jn"
M0fillchar(dele,sizeof(dele),false);
L_q}j/A
readln(f1,p1,p2,p3);
__A_q1p_E_k_U_x8Z0read(f1,s1);
!
l+E2b7R_H_k_u0close(f1);
Home_[$__e_P_y$D
mus:
=0;
6`:
m_a7w%r'
e0fori:
=1tolength(s1)doifs1[i]='
-'
thenbeginOlympiadinInformaticsBeginners'
Home9v/E_bl_t!
Ah-y
inc(mus);
_G-X__y_p_WK#c_\0site[mus]:
=i;
Home%z_C4[5c9__Y
kD
*z7M!
~_{(U5Y_cZ.V0fori:
=1tomusdobegin
"
i&
T_|_p_H_F_X6[0k:
=site[i];
inch[i].data:
='
Home_~
P4g+]_W({
if(k=1)or(k=length(s1))or(s1[k+1]='
)or(s1[k-1]='
)thenbegininch[i].pst:
=k;
continue;
_~_f_J-i_o_l0x:
=k-1;
y:
=k+1;
Home8y8d0q_R_c_G
asc:
=ord(s1[y])-ord(s1[x]);
_U-{+f"
Z_\$h4H0sa1:
=asc<
_Z,d_p'
d"
e__9J6|$^_C0sa2:
=(s1[x]in['
0'
..'
9'
])and(s1[y]in['
]);
Home_O3s_?
_O%Ht_p$N#|
sa3:
a'
z'
Home4C_?
`_X2s-r7Xj
ifasc=1thenbegindele[i]:
=true;
_l_g___S-C_c_t_m7U0ifsa1thenbegininch[i].pst:
Home_T_c&
B(u4\_t
ifsa2orsa3thenbegin
_P$K3Vu_j\p0tmp1:
=succ(s1[x]);
tmp2:
=pred(s1[y]);
Home)M_P_N(e$z(o5y~_k_B:
_%y
=tmp1totmp2doforl:
=1top2doinch[i].data:
=inch[i].data+j;
+T/q_aj_E0ifp3=2thenbegin
-}5l1f'
@-~V&
Y'
z)n_x_if$H0s2:
=inch[i].data;
m:
q2s*x2s)~_L_m0forl:
=length(s2)downto1dobegininc(m);
inch[i].data[m]:
=s2[l];
Home^_R8\_Ra!
SF
~
Home0x_v:
S\;
n_d9~*[
if(p1=2)and(s1[x]in['
])thenforl:
=1tolength(inch[i].data)doOlympiadinInformaticsBeginners'
HomeN,u+y?
_HS!
qk
inch[i].data[l]:
=upcase(inch[i].data[l]);
Home1X7w3z$V"
p6@_n5jW%\
ifp1=3thenforl:
=1tolength(inch[i].data)doinch[i].data[l]:
*'
Home_]c6`o1WF_u
inch[i].pst:
dele[i]:
Home_v2d_^)B`0o
endOlympiadinInformaticsBeginners'
g)fe4Q%a
elseinch[i].pst:
S4d'
O-{G4i0H0end;
B!
wy_k3F*Z4Q0len:
_Z_d1Z_i+D_wf]_MU0fori:
=1tomusdobegininsert(inch[i].data,s1,inch[i].pst+len);
len:
=len+length(inch[i].data);
k_m_}N_F2G0mus:
I_iI(w7j4c_z_{_W!
@0fori:
thenbegin
_O_p_S7I_]0d/{5e0inc(mus);
Y9@:
__}_G`_q){_r.q
site[mus]:
Home_h__g:
pm+Q&
l
pi"
Z_U_j_n_I6K_k_r0len:
HomeHIml_n&
{,|
fori:
=1tomusdoifdele[i]thenbegindelete(s1,site[i]-len,1);
inc(len);
*F_z8g'
\,__{(z1J0write(f2,s1);
_i_E_f_`%`3k0\_F"
|_n#x0close(f2);
Home7w$G_`0a&
a/W(X
k_}
Home){_{_e_}+|_F_}
三、矩阵取数游戏
G%Wo_P_]/F0 做到这里总算是碰到一道有点难度的题目了,当时看到这题也感觉挺熟悉的,总感觉哪里做过,是啊,vijos和rqnoj上都有类似的题目。
题目是二维的博弈问题,要求出取数的最大得分,显然是最优化问题,会不会是动态规划呢?
动态规划年年必考所以一定就是这样了。
对于二维的问题,我们还可以这样想,每次取数来说对于行之间是互相独立的,我们可以先取完第一行,再取另外的行,这样并不影响得分,于是我们可以借此进行一个巧妙的状态压缩,每次处理一行,这样二维问题就转化为了一维问题了,因此问题大大简化,然后考虑2的方幂的问题,我们自底向上地求解状态转移方程,因此边界就是f[i,j,k]=a[i,j]*2^m
(当k=j)也就最后一个数一定是第m个取到,我们也很容易想象,当取到[j,k]这个区间的时候,j和k一定是m-k+j个取到的数。
我们非常容易写出状态转移方程,用f[i,j,k]表示第i行,从数字j取到k的最大的分:
_F_s%\B7x7A,?
_{0f[i,j,k]=a[i,j]*2^m
(当j=k)OlympiadinInformaticsBeginners'
Homev
J7k_K_G`
f[i,j,k]=max{f[i,j+1,k]+a[i,j]*2^(m-k+j),f[i,j,k-1]+a[i,k]*2^(m-k+j)|k>
j}OlympiadinInformaticsBeginners'
Home5L_df_L1`_[_A5]_L_S
当然,本题由于数据量很大最大的数据将会达到1000*80*2^80,大约30位左右,超过了pascal中最大的数据范围qword,需要使用高精度,为了防止超时,需要考虑用万进制运算,并且本题需要反复查找2的幂次,所以我们可以先把2的幂次算好好保存在程序里,这样可以大大节省时间,但80个数要用高精度的形式打上去岂不很麻烦,这不成问题我们可以写一个printdata来帮助我们输出,2的1~63次很容易输出,这没有超过int64范围,所以我们可以用以下程序帮助我们输出:
%x_q&
Ir,?
_G)[;
f0programprint2^n;
P*C_w'
s]_o7B_r_I0varOlympiadinInformaticsBeginners'
Home.Y.v|_Uby3T2~*I_y
qword;
R)S5x_N2w)d!
_2i-j2k_M"
O0i:
HomeO_m5\'
z0o_D
a1,a2,a3,a4,a5:
_\4r;
c0c_b_u_y9i!
F{_r0len:
+}-k_X_d_L_\0s1:
string;
Home#|_v_`_q$A
Home_o4i_S_A*h
`Q_L
assign(output,'
2^n.txt'
rewrite(output);
8U*U_{)E_V_]0E0x:
HomeJw!
G_E$|)m_I'
M
=1to63dobegin
_J0y'
\_S/X_S"
t8T__&
I0x:
=xshl1;
6R"
u_[&
tX&
L9j0str(x,s1);
Home_A5b7H6f_J4K_kM'
O_b
len:
=(length(s1)+3)div4;
Home_G,?
_m%F_R
iflen=1thenwriteln('
pw['
i,'
].len:
len,'
'
p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NOIP 提高 复赛 试题 解题 报告