Ta gọi k-phân đoạn của dãy số đã cho là cách chia dãy số đã cho ra thành k đoạn, mỗi đoạn là một dãy con gồm các phần tử liên tiếp của dãy.. Yêu cầu: Hãy xác định số M nhỏ nhất để tồn tạ
Trang 1Bài 1: Phân đoạn Tên file chương trình: SEGPAR.PAS
Cho dãy số nguyên a 1 , a 2 …,a n và số nguyên dương k Ta gọi k-phân đoạn của dãy số đã cho là cách chia dãy số đã cho ra thành k đoạn, mỗi đoạn là một dãy con gồm các phần tử liên tiếp của dãy Chính xác hơn, một k-phân đoạn được xác định bởi dãy chỉ số
1 ≤ n1 < n 2 < … < n k = n.
Đoạn thứ i là dãy con a n i 1,a n i 2, ,a n i
1
− , i = 1,2,…,k Ở đây ta quy ước n 0 = 0
Yêu cầu: Hãy xác định số M nhỏ nhất để tồn tại k-phân đoạn sao cho tổng các phần tử trong
mỗi đoạn đều không vượt quá M.
Dữ liệu: Vào từ file văn bản SEGPAR.INP.
- Dòng đầu tiên chứa hai số nguyên n và k (1 ≤ k ≤ n ≤ 15000);
- Dòng thứ i trong số n dòng tiếp theo chứa số nguyên a i (|a i| ≤ 30000), i =1, 2, …,n
Các số cạnh nhau trên một dòng trong file dữ liệu cách nhau ít nhât một dấu cách
Kết quả: Ghi ra file SEGPAR.OUT một số nguyên duy nhất là giá trị trị M tìm được.
Ví dụ:
SEGPAR.INP
9 4
1
1
1
3
2
2
1
3
1
SEGPAR.OUT
5
Tập đoàn Công nghệ Amser nổi tiếng hiện có N nhân viên Dưới thời tổng giám đốc cũ, Huluxima gán cho mỗi nhân viên i (i = 1, 2, , N) một mã IP là một số nguyên dương Ai (tất nhiên 2 nhân viên khác nhau sẽ có số IP khác nhau) Hiện nay, Tổng giám đốc mới lên nắm quyền là Buđata rất chú trọng tới sự ngăn nắp và qui củ nên ông muốn ngay cả các số IP của nhân viên cũng phải được cân nhắc kỹ càng Khi có thêm một nhân viên mới, ông ta muốn biết số IP nhỏ nhất còn có thể gán cho nhân viên đó
Trang 2Yêu cầu: Cho N mã IP của các nhân viên trong tập đoàn, hãy tìm mã IP nhỏ nhất chưa xuất
hiện cho tập N mã đã cho
Dữ liệu: Trong file văn bản IP.INP gồm
- Dòng đầu là N (0 ≤ N ≤ 108)
- N dòng tiếp theo, dòng thứ i ghi số Ai (i = 1 N, 1 ≤ Ai ≤ 109)
Kết quả: Ra file văn bản IP.OUT gồm một số duy nhất là mã IP tìm được
Ví dụ:
IP.INP IP.OUT
3
3
1
4
2
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R+,S+,T-,V+,X+}
{$M 16384,0,655360}
program Ma_Ip;
const fi =’ip.inp’;
fo =’ip.out’;
type mang =array[0 31249] of word;
var ip,n :longint;
a :mang;
procedure turnon(var x:word;y:byte);
begin
x:=x or (1 shl y);
end;
function getbit(x:word;y:byte):byte;
begin
getbit:=(x shr y) and 1;
end;
procedure main;
var s,i,min,max :longint;
kx,j :byte;
f :text;
begin
for kx:=0 to 200 do
begin
fillchar(a,sizeof(a),0);
turnon(a[0],0);
min:=kx*500000;
max:=(kx+1)*500000;
Trang 3readln(f,n);
for i:=1 to n do
begin
read(f,s);
if (s>=min) and (s
begin
s:=s-min;
turnon(a[s shr 4],s and 15);
end;
end;
close(f);
assign(f,fo);rewrite(f);
for i:=0 to 31249 do
if a[i]<>65535 then
for j:=0 to 15 do
if getbit(a[i],j)=0 then
begin
ip:=min+i*16+j;
writeln(f,ip);
close(f);halt;
end;
end;
close(f);
end;
begin
main;
end
Bài 3: Dãy tam giác bao nhau Tên file chương trình: TAMGIAC.PAS
Cho n tam giác trên mặt phẳng Hãy tìm dãy các tam giác bao nhau nhiều nhất biết rằng tam giác i bao tam giác j nếu 3 đỉnh của tam giác j đều nằm trong hoặc nằm trên cạnh của tam giác i
Input: File Tamgiac.inp
- Dòng thứ nhất ghi số N (1 < N < 10000)
- N dòng tiếp theo dòng thứ i ghi 6 số nguyên là toạ độ 3 đỉnh của tam giác i
Output: File Tamgiac.out
Gồm một dòng chứa các số hiệu tam giác bao nhau
Ví dụ:
Trang 40 0 0 1 1 0
1 1 1 2 2 1
0 0 0 3 3 0
5 0 7 0 0 3
Program tamgiacbaonhau;
const fi='tamgiac.inp';
fo='tamgiac.out';
maxn=100;
epsilon=0.000001;
type diem=record
x,y:real;
end;
var a:array[1 maxn]of word;
tamgiac:array[1 6]of diem;
fx:array[1 maxn] of integer;
trace:array[1 maxn] of integer;
i,j,luu:word;
s,ss,sss:real;
n:word;
Procedure dientich;
var i:integer;
begin
S:=0;
for i:=1 to 3 do
S:=S+(tamgiac[i].x-tamgiac[i+1].x)*(tamgiac[i].y+tamgiac[i+1].y); S:=abs(S/2);
end;
Procedure input;
var f:text;k,j:integer;
begin
assign(f,fi);
reset(f);
readln(f,n);
a[1]:=1;
for i:=1 to 3 do read(f,tamgiac[i].x,tamgiac[i].y);
tamgiac[5]:=tamgiac[1];
readln(f);
for k:=2 to n do
begin
for i:=1 to 3 do read(f,tamgiac[i].x,tamgiac[i].y);
tamgiac[4]:=tamgiac[1];
dientich;
ss:=s;
tamgiac[4]:=tamgiac[5];sss:=0;
for j:=1 to 3 do
begin
tamgiac[6]:=tamgiac[j];
tamgiac[j]:=tamgiac[5];
dientich;sss:=sss+s;
tamgiac[j]:=tamgiac[6];
tamgiac[4]:=tamgiac[1];
end;
if abs(sss-ss)<epsilon then a[k]:=a[k-1]+1
else a[k]:=1;
Trang 5end;
close(f);
end;
procedure Init;
begin
fillchar(fx,sizeof(fx),1);
fillchar(trace,sizeof(trace),0);
end;
procedure Solve;
begin
for i:=2 to N do
begin
for j:=i-1 downto 1 do
if (A[j]<A[i]) and (fx[i]<fx[j]+1) then begin
fx[i]:=fx[j]+1;
trace[i]:=j;
end;
end;
end;
procedure WriteH(i:Word);
begin
if i >0 then
begin
WriteH(trace[i]);
write(i,' ');
end;
end;
procedure Print;
begin
assign(output,fo);
rewrite(output);
Luu:=N;
for i:=N-1 downto 1 do
If fx[i]>fx[Luu] then Luu:=i;
WriteH(Luu);
close(output);
end;
begin
Input;
Init;
Solve;
Print;
end.