【例3-2】取数游戏
【问题描述】
给出2n(n<=100)个自然数(数小于等于30000)。游戏双方分别为A方(计算机)和B方(对弈的人)。只允许从数列两头取数。A先取,然后双方一次轮流取数。取完时,谁取得的数字总和最大为取胜方;若双方和相同,属于A胜。试问A方可否有必胜的策略? 输入:4
7 9 3 6 4 2 5 3 R R R R
键盘输入n以及2*n个自然数。 输出: 3 5 2 4 6 3 9 7 36 19
共3n+2行,其中前3*n行为游戏过程。每三行分别为A方所取的数和B方所取的数,及B方取数前应给与适当的提示,让游戏者选取那一头的数(L/R—左端或右端)。最后两行分别为A方取数之和与B方取数之和。 【标程】
program ho;
var n,i,j,sa,sb,lp,rp,t:longint; ch:char;
a:array[1..200]of longint; begin
readln(n);
for i:=1 to 2*n do read(a[i]); sa:=0; sb:=0;
for i:=1 to n do begin
sa:=sa+a[2*i-1]; sb:=sb+a[2*i]; end;
if sa>=sb then j:=1 else begin j:=0; t:=sa; sa:=sb; sb:=t; end; lp:=1; rp:=2*n;
for i:=1 to n do begin
if (j=1)and(lp mod 2=1)or((j=0)and(lp mod 2=0)) then begin
writeln(a[lp]); inc(lp); end else begin
writeln(a[rp]); dec(rp); end;
write('B=L/R?'); repeat
readln(ch); if ch='L' then begin
writeln(a[lp]); inc(lp);
end;
if ch='R' then begin
writeln(a[rp]); dec(rp); end;
until(ch='L')or(ch='R'); end;
writeln(sa); writeln(sb); end.
【例3-3】活动选择
【问题描述】
假设有一个需要使用某以资源的n个活动组成的集合S,S={1,?,n}。该资源一次只能被一个活动占用,每一个活动有一个开始时间bi和结束时间ei(bi<=ei)。若bi>=ej或bj>=ei,则活动i和活动j兼容。
你的任务是:选择由相互兼容的活动组成的最大集合。 输入:
输入文件名为:act.in,共n+1行,其中第一行为n,第二行到第n+1行表示n各活动的开始时间和结束时间(中间用用空格隔开),格式为: n b1 e1 ?? bn en 输出:
输出文件名为:act.out,第一行为满足要求的活动占用的时间t,第二行为最大集合中的活动序号,每个数据之间用一个空格隔开。 【样例输入】 11 3 5 1 4 12 14 8 12 0 6 8 11 6 10 5 7 3 8 5 9 2 13