Copyright (C) IOI日本委員会 1996. All rights reserved.


問題1.

 2つの昇順にソートされている整数の列

  x1, x2, ..., xn
  y1, y2, ..., yn
と整数 z が与えられたとき、z = xi + yj となる i, j が存在するかどうかを 調べたい。データはファイル input.txt に
    n
    x1 y1
    x2 y2
      ...
    xn yn
という形式で入っている。

 以下のプログラムは上記のことを行うものである。関数 exist を完成させよ。
 比較演算や加減算の回数ができるだけ少ないものを考え、それに基づいて プログラムを書け。 この問題は、アルゴリズムの効率の良し悪しに重きをおいて採点する。


Cプログラム(1)

#include <stdio.h>
#define max_n 1000

typedef enum {false, true} boolean;
int n,x[max_n],y[max_n],z;

 ---------------------------------------------------------
|                                                         |
|                                                         |
|                                                         |
|       空欄部分(必要なら他の関数をここに定義せよ)           |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
 ---------------------------------------------------------

boolean exist(int z, int *i, int *j)
{
 ---------------------------------------------------------
|                                                         |
|                                                         |
|                     空欄部分                             |
|                                                         |
|                                                         |
 ---------------------------------------------------------
} 

void main()
{
    FILE *fin; int i,j;

    fin = fopen("input.txt", "r");
    fscanf(fin,"%d", &n);
    for (i=1; i<=n; i++) fscanf(fin,"%d %d", &x[i],&y[i]);
    printf("zの値を入力して下さい。");
    scanf("%d", &z);

    if (exist(z,&i,&j)) printf("例えば、i=%d, j=%d\n", i,j);
    else printf("i,jは存在しない。");
}


QuickBASICプログラム(1)

DEFINT A-Z
DECLARE FUNCTION exist (z, i, j)
 --------------------------------------------------
|            必要なら宣言を書き加えよ               |
 --------------------------------------------------
CONST maxN = 1000, true = -1, false = 0
DIM SHARED x(maxN), y(maxN) AS INTEGER
COMMON SHARED n, z AS INTEGER

    OPEN "input.txt" FOR INPUT AS #1
    INPUT #1, n
    FOR i = 1 TO n: INPUT #1, x(i), y(i): NEXT i
    PRINT "zの値を入力して下さい。": INPUT z
    IF exist(z, i, j) THEN
        PRINT "例えば、i="; i; " j="; j
    ELSE
        PRINT "i,jは存在しない。"
    END IF
END

FUNCTION exist (z, i, j)
 ---------------------------------------------------------
|                                                         |
|                                                         |
|                                                         |
|         空欄部分(必要なら他の関数も定義せよ)               |
|                                                         |
|                                                         |
|                                                         |
|                                                         |
 ---------------------------------------------------------


Pascalプログラム(1)

program problem1;
const max_n=1000;
var n,z:integer;
    x,y:array[1..max_n] of integer;

    function exist(z:integer; var i,j:integer):boolean;
     ---------------------------------------------------------
    |                                                         |
    |                                                         |
    |                                                         |
    |         空欄部分(必要なら他の関数も定義せよ)               |
    |                                                         |
    |                                                         |
    |                                                         |
    |                                                         |
     ---------------------------------------------------------

var fin:text; i,j:integer;

begin {main}
    assign(fin,'input.txt'); reset(fin);
    readln(fin, n);
    for i:=1 to n do readln(fin, x[i],y[i]);
    write('zの値を入力して下さい。'); readln(z);
    if exist(z,i,j) then writeln('例えば、i=',i,' j=',j)
                    else writeln('i,jは存在しない。')
end.


JOIホームページへ戻る

JOI'96へ戻る