Professional Documents
Culture Documents
Hai bạn học sinh trong lúc nhàn rỗi nghĩ ra trò chơi sau đây. Mỗi bạn chọn trước một dãy số gồm n số
nguyên. Giả sử dãy số mà bạn thứ nhất chọn là:
Yêu cầu
Hãy xác định giá nhỏ nhất của một lượt chơi trong số các lượt chơi có thể.
Dữ liệu
Dòng đầu tiên chứa số nguyên dương n (n ≤ 105)
Dòng thứ hai chứa dãy số nguyên b1, b2, ..., bn (|bi| ≤ 109, i=1, 2, ..., n)
Dòng thứ hai chứa dãy số nguyên c1, c2, ..., cn (|ci| ≤ 109, i=1, 2, ..., n)
Hai số liên tiếp trên một dòng được ghi cách nhau bởi dấu cách.
Kết quả
Ghi ra giá nhỏ nhất tìm được.
Ràng buộc
60% số tests ứng với 60% số điểm của bài có 1 ≤ n ≤ 1000.
Ví dụ
<b>Dữ liệu:</b>
2
1 -2
2 3
<b>Kết qủa</b>
0
LÒ CÒ
Mã bài: JUMP
Khi đó có thể di chuyển được nhiều nhất qua 4 vòng tròn (tương ứng với đường di chuyển được tô đậm
trên hình vẽ).
Yêu cầu
Hãy xác định xem trong trò chơi mô tả ở trên, nhiều nhất có thể di chuyển được qua bao nhiêu vòng tròn.
Dữ liệu
Dòng đầu chứa số nguyên n (3 ≤ n ≤ 1000);
Dòng thứ hai chứa dãy số nguyên dương a1, a2, ..., an (ai ≤ 109, i=1, 2,..., n).
Hai số liên tiếp trên một dòng được ghi cách nhau bởi dấu cách.
Kết quả
Ghi ra số lượng vòng tròn trên đường di chuyển tìm được.
Ràng buộc
60% số tests ứng với 60% số điểm của bài có 3 ≤ n ≤ 100.
Ví dụ
<b>Dữ liệu:</b>
5
1 2 8 3 5
<b>Kết qủa</b>
4
3. QUÀ TẾT
Mã bài: GIFTS
Submission link: <a
href="http://vn.spoj.pl/IOITRAIN/problems/NKGIFTS">vn.spoj.pl/IOITRAIN/
problems/NKGIFTS</a>
Chuẩn bị đón năm mới. Công ty bánh kẹo Hương Dứa đã làm một tấm sôcôla cực lớn với mục đích ghi tên
mình vào sách kỷ lục Ghi-nét đồng thời quảng bá thương hiệu trước công chúng. Tấm sôcôla có hình
vuông kích thước 2kx2k, tạo thành lưới ô vuông 2k hàng và 2k cột. Các hàng được đánh số từ 0 đến 2k-1 từ
trên xuống dưới, các cột được đánh số từ 0 đến 2k-1 từ trái sang phải. Ô nằm ở hàng i và cột j được gọi là ô
(i, j). Sau buổi trưng bày giới thiệu sản phẩm, tấm sôcôla được cắt nhỏ, chia cho mọi người, mỗi người
được một ô của chiếc bánh kỷ lục. Bộ phận tiếp thị đã ấn vào hai ô khác nhau (p, q) và (u, v) mỗi ô một
đồng xu. Vị khách nào may mắn nhận được ô sôcôla có đồng xu sẽ được tặng rất nhiều sản phẩm độc đáo
của công ty.
Vì chiếc bánh rất lớn nên công ty đã thiết kế một máy cắt bánh. Máy thực hiện dãy các thao tác cắt, bắt đầu
từ chồng bánh chỉ gồm 1 tấm sôcôla ban đầu, mỗi thao tác gồm hai bước sau:
Bước 1: Cắt ngang song song với cạnh chồng bánh chia chồng sôcôla thành hai phần bằng nhau,
úp chồng bánh bên dưới lên chồng bánh bên trên sao cho mép dưới đè lên mép trên.
Bước 2: Cắt dọc song song với cạnh chồng bánh chia chồng sôcôla thành hai phần bằng nhau, úp
chồng bánh bên trái lên chồng bánh bên phải sao cho mép trái đè lên mép phải.
Như vậy sau mỗi lần thực hiện thao tác cắt, chiều dài và chiều rộng của các tấm sôcôla giảm đi một nửa.
Sau k lần thực hiện thao tác cắt, các ô của tấm sôcôla sẽ được xếp thành một cột. Khách nhận bánh xếp
hàng một và được đánh số từ 1 trở đi, người thứ m sẽ nhận được miếng sôcôla thứ m từ trên xuống dưới.
(1 ≤ m ≤ 2k x 2k).
Ví dụ, với k=1 và đồng xu được ấn vào các ô (0,0), (1,1), việc thực hiện các thao tác cắt sẽ được trình bày
trên hình vẽ minh họa ở trên. Trong ví dụ này, vị khách thứ nhất và thứ ba sẽ là những người nhận được
tặng phẩm của công ty.
Yêu cầu
Cho biết các số nguyên k, p, q, u, v. Hãy xác định số thứ tự của hai vị khách may mắn nhận được quà.
Dữ liệu
Gồm một dòng chứa 5 số nguyên k, p, q, u, v, các số cách nhau bởi dấu cách.
Kết quả
Một dòng chứa hai số nguyên là số thứ tự các vị khách may mắn. Hai số phải cách nhau đúng một dấu
cách.
Ràng buộc
1 ≤ k ≤ 40, 0 ≤ p, q, u, v ≤ 2k - 1.
60% số tests ứng với 60% số điểm của bài có 1 ≤ k ≤ 5.
Ví dụ
<strong>Dữ liệu:</strong>
1 0 0 1 1
<strong>Kết qủa</strong>
1 3
Bài 1:
(C++ / Tác giả: Ngô Minh Đức)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <set>
#include <string>
using namespace std;
#define FIN "SEQGAME.INP"
#define FOUT "SEQGAME.OUT"
#define NMAX 110000
int n;
int b[NMAX], c[NMAX];
int main()
{
freopen(FIN,"r",stdin);
freopen(FOUT,"w",stdout);
scanf("%d", &n);
for (int i=0; i<n; i++)
scanf("%d", &b[i]);
for (int i=0; i<n; i++)
scanf("%d", &c[i]);
sort(b,b+n);
sort(c,c+n);
int i=0, j=n-1;
int r=2100000000;
while (i<n && j>=0)
{
r=min(r, abs(b[i]+c[j]));
if (b[i]+c[j]>=0)
j--;
else
i++;
}
printf("%d",r);
return 0;
}
(Pascal / Tác giả: Phạm Quang Vũ)
program SEQGAME;
const
InputFile = 'SEQGAME.INP';
OutputFile = 'SEQGAME.OUT';
max = 100000;
type
TArray = array[1..max] of Integer;
var
b, c: TArray;
n: Integer;
DiffMin: Integer;
procedure Enter;
var
f: TextFile;
i, temp: Integer;
begin
AssignFile(f, InputFile); Reset(f);
try
ReadLn(f, n);
for i := 1 to n do Read(f, b[i]);
ReadLn(f);
for i := 1 to n do
begin
Read(f, temp);
c[i] := -temp;
end;
finally
CloseFile(f);
end;
end;
procedure QuickSort(var k: TArray; L, H: Integer);
var
i, j: Integer;
temp, pivot: Integer;
begin
if L >= H then Exit;
pivot := k[L + Random(H - L + 1)];
i := L; j := H;
repeat
while k[i] < pivot do Inc(i);
while k[j] > pivot do Dec(j);
if i <= j then
begin
if i < j then
begin
temp := k[i]; k[i] := k[j]; k[j] := temp;
end;
Inc(i); Dec(j);
end;
until i > j;
QuickSort(k, L, j);
QuickSort(k, i, H);
end;
procedure Update(x, y: Integer); inline;
begin
if Abs(x - y) < DiffMin then DiffMin := Abs(x - y);
end;
procedure Solve;
var
v, i, j: Integer;
begin
DiffMin := MaxInt;
j := 1;
for i := 1 to n do
begin
v := b[i];
while (j <= n) and (v > c[j]) do Inc(j);
if j <= n then Update(v, c[j]);
if j > 1 then Update(v, c[j - 1]);
end;
end;
procedure PrintResult;
var
f: TextFile;
begin
AssignFile(f, OutputFile); Rewrite(f);
try
WriteLn(f, DiffMin);
finally
CloseFile(f);
end;
end;
begin
Enter;
QuickSort(b, 1, n);
QuickSort(c, 1, n);
Solve;
PrintResult;
end.
4
1 2 999999999 1000000000
-5 -6 -999999997 -999999998
Bài 2:
(Pascal / Tác giả: Ngô Minh Đức)
const
finp='JUMP.INP';
fout='JUMP.OUT';
nmax=1200;
var
i, j, k, t, n, last, kq: longint;
g: array[1..nmax, 1..nmax] of boolean;
a: array[1..nmax] of longint;
f: array[1..nmax] of longint;
begin
assign(input, finp);
reset(input);
assign(output, fout);
rewrite(output);
read(n);
for i:=1 to n do
read(a[i]);
for i:=1 to n-1 do
for j:=i+1 to n do
if (a[i]>a[j]) then
begin
t:=a[i];
a[i]:=a[j];
a[j]:=t;
end;
fillchar(g, sizeof(g), false);
for i:=1 to n-2 do
begin
last:=i+2;
for j:=i+1 to n-1 do
for k:=last to n do
begin
if a[i]+a[j]=a[k] then
begin
g[i, k]:=true;
g[j, k]:=true;
end else if a[k]>a[i]+a[j] then
break;
last:=k;
end;
end;
kq:=-1;
for i:=1 to n do
begin
f[i]:=1;
for j:=1 to i-1 do
if (g[j, i]) and (f[j]+1>f[i]) then
f[i]:=f[j]+1;
if f[i]>kq then
kq:=f[i];
end;
writeln(kq);
close(input);
close(output);
end.
Bài 3:
(Pascal / Tác giả: Lê Văn Hồng Chân)
const
fin='GIFTS.INP';
fon='GIFTS.OUT';
maxn=40;
rad=1000000000000000;
type
bigint=record l,h:qword end;
var
fi,fo:text;
n,m,x1,x2,y1,y2:qword;
i,k:longint;
d1,d2,h,s:bigint;
operator - (a,b:bigint) c:bigint;
begin
c.h:=a.h-b.h;
if a.l<b.l then begin c.h:=c.h-1; a.l:=a.l+rad end;
c.l:=a.l-b.l;
end;
operator + (a,b:bigint) c:bigint;
begin
c.l:=a.l+b.l;
c.h:=(c.l div rad)+a.h+b.h;
c.l:=c.l mod rad;
end;
begin
assign(fi,fin); reset(fi);
assign(fo,fon); rewrite(fo);
read(fi,k,x1,y1,x2,y2);
n:=1; d1.l:=1; d2.l:=1;
for i:=1 to k do n:=n shl 1;
n:=n-1; s.l:=1; h.l:=1;
repeat
m:=n shr 1;
if x1>m then begin x1:=n-x1; d1:=h-d1+s end else d1:=d1+h;
if x2>m then begin x2:=n-x2; d2:=h-d2+s end else d2:=d2+h;
h:=h+h; m:=m+1;
if y1<m then begin y1:=n-y1; d1:=h-d1+s end else d1:=d1+h;
if y2<m then begin y2:=n-y2; d2:=h-d2+s end else d2:=d2+h;
y1:=y1-m; y2:=y2-m;
n:=m-1; h:=h+h;
until n=0;
if d1.h>0 then write(fo,d1.h); write(fo,d1.l,' ');
if d2.h>0 then write(fo,d2.h); writeln(fo,d2.l);
close(fi); close(fo);
end.