noip普及组复赛模拟试题17(附答案)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图书馆馆长正犯愁呢,原来,有一堆的书要他整理,每本书都有一个书号(<=32767),现在他有一本书,这本书的书号为K(<=32767),现在他要找出一本书号比这本书大的书和书号比这本小的书(但都要最接近图书馆馆长已有的书号),将找到的这两本书的书号加起来,并算出加起来以后的数是否为素数

Input

第一行二个数为N,K,表示几本书以及手中书的书号(<=32767)

第二行开始有N个整数,表示这些书的书号

Output

第一行一个数,表示两本书书号加起来的和

第二行一个字符,表示和是否为素数,若是则输出"Y"否则输出"F"(引号不打出)Sample Input

6 5

6 4 5 3 1 20

Sample Output

10

F

program ex1148;

var n,k,i,x,s:integer;

a:array[0..32767] of integer;

f:boolean;

begin

readln(n,k);

fillchar(a,sizeof(a),0);

for i:=1 to n do

begin

read(x);

a[x]:=1;

end;

s:=0;

for i:=k+1 to 32767 do

if a[i]<>0 then begin s:=s+i;break; end;

for i:=k-1 downto 1 do

if a[i]<>0 then begin s:=s+i;break; end;

f:=true;

for i:=2 to trunc(sqrt(s)) do

if s mod i=0 then begin f:=false;break;end;

writeln(s);

if f=true then write('Y') else write('F');

end.

输入12 7

8 12 18 7 11 3 20 15 14 26 21 16 输出11

Y

输入21 10

4 7 12 10 18 29 1

5

6 1

7 3 11 20 21 24 14 2 22 26 13 19 9 输出20

F

父母准备带你到新疆阿克苏旅行,你很高兴的开始准备旅行。现在你有M元钱,可以采购N种物品,每种物品最多可以购买Ai件(也可以不购买),每购买一件会花费Ci元,并能产生Vi的价值。请算出你能买的物品的最大价值和。

【输入】第一行,两个整数M,N用空格隔开。

后面N行,每行三个整数用空格隔开Ai、Ci、Vi

【输出】一个整数,能买的物品的最大价值和

【输入输出样例】

【输入输出样例说明】

购买第二种物品1件,第三中物品2件。

var

a: array[1..100, 1..3] of longint;

m, n: longint;

i, j, k, ans: longint;

f: array[0..10000] of longint;

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

begin

if a > b then

exit(a)

exit(b);

end;

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

begin

if a < b then

exit(a)

else

exit(b);

end;

begin

Assign(input, 'prepare.in');

Assign(output, 'prepare.out');

reset(input);

rewrite(output);

readln(m, n);

for i := 1 to n do

readln(a[i, 1], a[i, 2], a[i, 3]);

for i := 1 to n do

if a[i, 1] * a[i, 2] > m then

for j := a[i, 2] to m do

f[j] := max(f[j], a[i, 3] + f[j - a[i, 2]])

begin

k := 1;

while k < a[i, 1] do

begin

for j := m downto k * a[i, 2] do

f[j] := max(f[j], k * a[i, 3] + f[j - k * a[i, 2]]);

a[i, 1] := a[i, 1] - k;

k := k shl 1;

end;

for j := m downto a[i, 1] * a[i, 2] do

f[j] := max(f[j], a[i, 1] * a[i, 3] + f[j - a[i, 1] * a[i, 2]]); end;

writeln(f[m]);

Close(input);

Close(output);

end.

输入 100 5

1 30 6

2 20 5

3 40 7

4 3

5 4

5 50 8 输出 19

输入 300 6

相关文档
最新文档