Noip2014普及组

Noip2014普及组  



一.珠心算测试

【问题描述】

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正

整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

【输入】

输入文件名为count.in。

输入共两行,第一行包含一个整数n,表示测试题中给出的正整数个数。

第二行有n个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

【输出】

输出文件名为count.out。

输出共一行,包含一个整数,表示测验题答案。

【输入输出样例】

count.in

count.out

4

1 2 3 4

2

【样例说明】

由1+2=3,1+3=4,故满足测试要求的答案为2。注意,加数和被加数必须是集合中的两个不同的数。

【数据说明】

对于100%的数据,3 ≤ n ≤ 100,测验题给出的正整数大小不超过10,000。

【代码】

program count;
var i,j,k,n,s:integer;
a,b:array[0..105]of integer;
begin
  readln(n);
  for i:=1 to n do
    read(a[i]);
  for i:=1 to n do
    b[i]:=0;
  for i:=1 to n do
    for j:=1 to n do
      for k:=1 to n do
        if (a[i]=a[j]+a[k])and(i<>j)and(j<>k)and(k<>i) then b[i]:=1;
  s:=0;
  for i:=1 to n do
    if b[i]=1 then s:=s+1;
  writeln(s);
end.
 

二.比例化简

【问题描述】

在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有1498人,反对的有902人,那么赞同与反对的比例可以简单的记为1498:902。

不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大,难以一眼看出它们的关系。对于上面这个例子,如果把比例记为5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。

现给出支持人数A,反对人数B,以及一个上限L,请你将A比B化简为A’比B’,要求在A’和B’均不大于L且A’和B’互质(两个整数的最大公约数是1)的前提下,

A’/ B’ ≥ A/B且A’/B’- A/B的值尽可能小。

【输入】

输入文件名为ratio.in。

输入共一行,包含三个整数A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限

【输出】

输出文件名为ratio.out

输出共一行,包含两个整数A’,B’,中间用一个空格隔开,表示化简后的比例。

【输入输出样例】

ratio.in

ratio.out

1498 902 10

5 3

【数据说明】

对于100%的数据,1 ≤ A ≤ 1,000,000,1 ≤ B ≤ 1,000,000,1 ≤ L ≤ 100,

A/B ≤ L。

 【代码】


program ratio;
var a,b,a1,b1,d,i,j,l:longint;
c1,c2,c3,min:real;
function gys(m,n:longint):longint;
var a,b,r:longint;
begin
  a:=m;
  b:=n;
  repeat
    r:=a mod b;a:=b;
    b:=r;
  until r=0;
  gys:=a;
end;
begin
  readln(a,b,l);
  c1:=a/b;
  min:=1000;
  for i:=1 to l do
  begin
    for j:=1 to l do
      begin
        c2:=i/j;
        c3:=c2-c1;
        d:=gys(i,j);
        if (c3<min) and (d=1) and(c3>=0) then begin min:=c3;a1:=i;b1:=j;end;
      end;
  end;
  write(a1,' ');
  writeln(b1);
end.
 

 螺旋矩阵

【问题描述】

一个n行n列的螺旋矩阵可由如下方法生成:

从矩阵的左上角(第1行第1列)出发,初始时向右移动;如果前方是未曾经过的格子,

则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1, 2, 3, ... , n2,便构成了一个螺旋矩阵。

下图是一个n = 4 时的螺旋矩阵。

现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。

【输入】

输入文件名为matrix.in。

输入共一行,包含三个整数n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。

【输出】

输出文件名为matrix.out。

输出共一行,包含一个整数,表示相应矩阵中第i行第j列的数。

【输入输出样例】

matrix.in

matrix.out

4 2 3

14

【数据说明】

对于50%的数据,1 ≤ n ≤ 100;

对于100%的数据,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。

【代码】

program matrix;
var
  n,i,j,tn,s,m,k:longint;


procedure print(x,y:longint);
  begin
    if x=1 then begin writeln(s+y-1); exit end;
    s:=s+tn-1;
    if y=tn then begin writeln(s+x-1); exit end;
    s:=s+tn-1;
    if x=tn then begin writeln(s+tn-y); exit end;
    s:=s+tn-1;
    writeln(s+tn-x)
  end;


function min(x,y:longint):longint;
  begin
    if x<=y then exit(x) else exit(y)
  end;


begin
  readln(n,i,j);
  m:=min(i,min(j,min(n-i+1,n-j+1)));
  i:=i-m+1;
  j:=j-m+1;
  tn:=n;
  s:=1;
  for k:=1 to m-1 do
    begin
      inc(s,4*tn-4);
      dec(tn,2)
    end;
  print(i,j);
end.
 

子矩阵(submatrix. pas)

【问题描述】

给出如下定义:

1. 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵。

例如,下面左图中选取第2、4行和第2、4、5列交叉位置的元素得到一个2*3的子矩阵如右图所示。

2. 相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的。

3. 矩阵的分值:矩阵中每一对相邻元素之差的绝对值之和。

本题任务:给定一个n行m列的正整数矩阵,请你从这个矩阵中选出一个r行c列的子矩阵,使得这个子矩阵的分值最小,并输出这个分值。

【输入】

输入文件名为submatrix.in。

第一行包含用空格隔开的四个整数n,m,r,c,意义如问题描述中所述,每两个整数之间用一个空格隔开。

接下来的n行,每行包含m个用空格隔开的整数,用来表示问题描述中那个n行m列的矩阵。

【输出】

输出文件名为submatrix.out。

输出共1行,包含1个整数,表示满足题目描述的子矩阵的最小分值。

【输入输出样例1】

submatrix.in

submatrix.out

5 5 2 3

9 3 3 3 9

9 4 8 7 4

1 7 4 6 6

6 8 5 6 9

7 4 5 6 1

6

 

【输入输出样例1说明】

该矩阵中分值最小的2行3列的子矩阵由原矩阵的第4行、第5行与第1列、第3列、第4列交叉位置的元素组成,为 其分值为

【输入输出样例2】

submatrix.in

submatrix.out

7 7 3 3

7 7 7 6 2 10 5

5 8 8 2 1 6 2

2 9 5 5 6 1 7

7 9 3 6 1 7 8

1 9 1 4 7 8 8

10 5 9 1 1 8 10

1 3 1 5 4 8 6

16

 

【输入输出样例2说明】

该矩阵中分值最小的3行3列的子矩阵由原矩阵的第4行、第5行、第6行与第2列、第6列、第7列交叉位置的元素组成,选取的分值最小的子矩阵为

【数据说明】

对于50%的数据,1≤n≤12,1≤m≤12,矩阵中的每个元素1≤a[i,j]≤20;

对于100%的数据,1≤n≤16,1≤m≤16,矩阵中的每个元素1≤a[i,j]≤1000, 1≤r≤n,1≤c≤m。

【代码】


一.珠心算测试

【问题描述】

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正

整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

【输入】

输入文件名为count.in。

输入共两行,第一行包含一个整数n,表示测试题中给出的正整数个数。

第二行有n个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

【输出】

输出文件名为count.out。

输出共一行,包含一个整数,表示测验题答案。

【输入输出样例】

count.in

count.out

4

1 2 3 4

2

【样例说明】

由1+2=3,1+3=4,故满足测试要求的答案为2。注意,加数和被加数必须是集合中的两个不同的数。

【数据说明】

对于100%的数据,3 ≤ n ≤ 100,测验题给出的正整数大小不超过10,000。

【代码】

program count;
var i,j,k,n,s:integer;
a,b:array[0..105]of integer;
begin
  readln(n);
  for i:=1 to n do
    read(a[i]);
  for i:=1 to n do
    b[i]:=0;
  for i:=1 to n do
    for j:=1 to n do
      for k:=1 to n do
        if (a[i]=a[j]+a[k])and(i<>j)and(j<>k)and(k<>i) then b[i]:=1;
  s:=0;
  for i:=1 to n do
    if b[i]=1 then s:=s+1;
  writeln(s);
end.
 

二.比例化简

【问题描述】

在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果。例如,对某一观点表示支持的有1498人,反对的有902人,那么赞同与反对的比例可以简单的记为1498:902。

不过,如果把调查结果就以这种方式呈现出来,大多数人肯定不会满意。因为这个比例的数值太大,难以一眼看出它们的关系。对于上面这个例子,如果把比例记为5:3,虽然与真实结果有一定的误差,但依然能够较为准确地反映调查结果,同时也显得比较直观。

现给出支持人数A,反对人数B,以及一个上限L,请你将A比B化简为A’比B’,要求在A’和B’均不大于L且A’和B’互质(两个整数的最大公约数是1)的前提下,

A’/ B’ ≥ A/B且A’/B’- A/B的值尽可能小。

【输入】

输入文件名为ratio.in。

输入共一行,包含三个整数A,B,L,每两个整数之间用一个空格隔开,分别表示支持人数、反对人数以及上限

【输出】

输出文件名为ratio.out

输出共一行,包含两个整数A’,B’,中间用一个空格隔开,表示化简后的比例。

【输入输出样例】

ratio.in

ratio.out

1498 902 10

5 3

【数据说明】

对于100%的数据,1 ≤ A ≤ 1,000,000,1 ≤ B ≤ 1,000,000,1 ≤ L ≤ 100,

A/B ≤ L。

 【代码】


program ratio;
var a,b,a1,b1,d,i,j,l:longint;
c1,c2,c3,min:real;
function gys(m,n:longint):longint;
var a,b,r:longint;
begin
  a:=m;
  b:=n;
  repeat
    r:=a mod b;a:=b;
    b:=r;
  until r=0;
  gys:=a;
end;
begin
  readln(a,b,l);
  c1:=a/b;
  min:=1000;
  for i:=1 to l do
  begin
    for j:=1 to l do
      begin
        c2:=i/j;
        c3:=c2-c1;
        d:=gys(i,j);
        if (c3<min) and (d=1) and(c3>=0) then begin min:=c3;a1:=i;b1:=j;end;
      end;
  end;
  write(a1,' ');
  writeln(b1);
end.
 

 螺旋矩阵

【问题描述】

一个n行n列的螺旋矩阵可由如下方法生成:

从矩阵的左上角(第1行第1列)出发,初始时向右移动;如果前方是未曾经过的格子,

则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1, 2, 3, ... , n2,便构成了一个螺旋矩阵。

下图是一个n = 4 时的螺旋矩阵。

现给出矩阵大小n以及i和j,请你求出该矩阵中第i行第j列的数是多少。

【输入】

输入文件名为matrix.in。

输入共一行,包含三个整数n,i,j,每两个整数之间用一个空格隔开,分别表示矩阵大小、待求的数所在的行号和列号。

【输出】

输出文件名为matrix.out。

输出共一行,包含一个整数,表示相应矩阵中第i行第j列的数。

【输入输出样例】

matrix.in

matrix.out

4 2 3

14

【数据说明】

对于50%的数据,1 ≤ n ≤ 100;

对于100%的数据,1 ≤ n ≤ 30,000,1 ≤ i ≤ n,1 ≤ j ≤ n。

【代码】

program matrix;
var
  n,i,j,tn,s,m,k:longint;


procedure print(x,y:longint);
  begin
    if x=1 then begin writeln(s+y-1); exit end;
    s:=s+tn-1;
    if y=tn then begin writeln(s+x-1); exit end;
    s:=s+tn-1;
    if x=tn then begin writeln(s+tn-y); exit end;
    s:=s+tn-1;
    writeln(s+tn-x)
  end;


function min(x,y:longint):longint;
  begin
    if x<=y then exit(x) else exit(y)
  end;


begin
  readln(n,i,j);
  m:=min(i,min(j,min(n-i+1,n-j+1)));
  i:=i-m+1;
  j:=j-m+1;
  tn:=n;
  s:=1;
  for k:=1 to m-1 do
    begin
      inc(s,4*tn-4);
      dec(tn,2)
    end;
  print(i,j);
end.
 

子矩阵(submatrix. pas)

【问题描述】

给出如下定义:

1. 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵。

例如,下面左图中选取第2、4行和第2、4、5列交叉位置的元素得到一个2*3的子矩阵如右图所示。

2. 相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的。

3. 矩阵的分值:矩阵中每一对相邻元素之差的绝对值之和。

本题任务:给定一个n行m列的正整数矩阵,请你从这个矩阵中选出一个r行c列的子矩阵,使得这个子矩阵的分值最小,并输出这个分值。

【输入】

输入文件名为submatrix.in。

第一行包含用空格隔开的四个整数n,m,r,c,意义如问题描述中所述,每两个整数之间用一个空格隔开。

接下来的n行,每行包含m个用空格隔开的整数,用来表示问题描述中那个n行m列的矩阵。

【输出】

输出文件名为submatrix.out。

输出共1行,包含1个整数,表示满足题目描述的子矩阵的最小分值。

【输入输出样例1】

submatrix.in

submatrix.out

5 5 2 3

9 3 3 3 9

9 4 8 7 4

1 7 4 6 6

6 8 5 6 9

7 4 5 6 1

6

 

【输入输出样例1说明】

该矩阵中分值最小的2行3列的子矩阵由原矩阵的第4行、第5行与第1列、第3列、第4列交叉位置的元素组成,为 其分值为

【输入输出样例2】

submatrix.in

submatrix.out

7 7 3 3

7 7 7 6 2 10 5

5 8 8 2 1 6 2

2 9 5 5 6 1 7

7 9 3 6 1 7 8

1 9 1 4 7 8 8

10 5 9 1 1 8 10

1 3 1 5 4 8 6

16

 

【输入输出样例2说明】

该矩阵中分值最小的3行3列的子矩阵由原矩阵的第4行、第5行、第6行与第2列、第6列、第7列交叉位置的元素组成,选取的分值最小的子矩阵为

【数据说明】

对于50%的数据,1≤n≤12,1≤m≤12,矩阵中的每个元素1≤a[i,j]≤20;

对于100%的数据,1≤n≤16,1≤m≤16,矩阵中的每个元素1≤a[i,j]≤1000, 1≤r≤n,1≤c≤m。

【代码】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值