DeDATinchon DTQG16

16 103 0
DeDATinchon DTQG16

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Dữ liệu: Vào từ file văn bản TERA.INP - Dòng 1 chứa hai số nguyên dương ; - Dòng 2 chứa số nguyên dương là độ dài đoạn dây xanh - Dòng 3 chứa số nguyên dương là độ dài đoạn dây đỏ - Dòng[r]

(1)SỞ GD&ĐT LÀO CAI KỲ THI CHỌN ĐỘI TUYỂN DỰ THI HSG QUỐC GIA THPT NĂM 2016 ĐỀ CHÍNH THỨC Tên bài Nối dây Số nguyên tố Hành trình du lịch Môn: TIN HỌC Thời gian: 180 phút (Không kể thời gian giao đề) Ngày thi: 20/10/2015 (Đề thi gồm 03 trang) TỔNG QUAN VỀ BÀI THI File chương trình TERA.* File vào TERA.INP TERA.OUT TOUR.INP TOUR.OUT PRIME.INP PRIME.* TOUR.* File PRIME.OUT Dấu * thay PAS CPP ngôn ngữ lập trình tường ứng là Pascal C++ Hãy lập trình giải các bài toán sau: Bài 1: (6 điểm) Nối dây Đề thi vào trường mẫu giáo SuperBabies khá đơn giản: Có đoạn dây xanh, đoạn dây đỏ, đoạn dây tím và đoạn dây vàng Độ dài các đoạn dây cho trước Mỗi bé cho số nguyên và cần cho biết có bao nhiêu cách chọn đúng đoạn dây xanh, đoạn dây đỏ, đoạn dây tím và đoạn dây vàng để nối lại thành sợi dây trang trí có độ dài Hai cách chọn gọi là khác có đoạn dây chọn cách không chọn cách còn lại Yêu cầu: Viết chương trình tìm đáp án để chấm cho các bé Dữ liệu: Vào từ file văn TERA.INP - Dòng chứa hai số nguyên dương ; - Dòng chứa số nguyên dương là độ dài đoạn dây xanh - Dòng chứa số nguyên dương là độ dài đoạn dây đỏ - Dòng chứa số nguyên dương là độ dài đoạn dây tím - Dòng chứa số nguyên dương là độ dài đoạn dây vàng Các số trên dòng input file ghi cách dấu cách, độ dài các đoạn dây không quá Kết quả: Ghi file văn TERA.OUT số nguyên là số cách chọn tính Ví dụ: TERA.INP TERA.OUT - 28 18 111 111 10 11 12 13 14 15 Chú ý: Có ít 40% số điểm ứng với các test có 1/3 (2) Bài Số nguyên tố Cho dãy số nguyên x1, x2, …, xN và hàm f(p) là số lượng các phần tử thuộc dãy x chia hết cho p Cho M truy vấn, truy vấn cho hai số nguyên li, ri Bạn phải trả lời câu hỏi: Tính tổng: , đây S(li, ri) là tập các số nguyên tố thuộc đoạn [li,ri] INPUT:  Dòng đầu tiên chứa giá trị N (1 ≤ N ≤ 106)  Dòng hai chứa N số nguyên x1, x2, …, xN (2 ≤ xi ≤ 105)  Dòng ba chứa giá trị M (1 ≤ M ≤ 5.104)  M dòng tiếp theo, dòng chứa hai số li, ri (2 ≤ li ≤ ri ≤ 2.109) OUTPUT:  Gồm M dòng, dòng là câu trả lời truy vấn tương ứng INPUT Ví dụ: PRIME.INP 5 10 14 15 11 12 44 PRIME.OUT Giải thích:  Tại truy vấn 1: l = 2, r = 11: Ta cần tính f(2) + f(3) + f(5) + f(7) + f(11) = + + + + =  Tại try vấn 2: l = 3, r = 12: Ta cần tính f(3) + f(5) + f(7) + f(11) = + + + = Tại truy vấn 3: l = 4, r = 4: không có số nguyên tố nào thuộc đoạn [l,r], nên kết truy vấn * Chú ý:  40% test ≤ N, M ≤ 100; ≤ li ≤ ri ≤ 1000  40% test ≤ N, M ≤ 1000; ≤ li ≤ ri ≤ 1000  20% test còn lại ≤ N ≤ 106, ≤ xi ≤ 105, ≤ M ≤ 5.104, ≤ li ≤ ri ≤ 2.109 Bài 3: Hành trình du lịch Công ty du lịch LCTRAVEL chuyên tổ chức các hành trình du lịch vùng lãnh thổ gồm điểm du lịch trọng điểm, đánh số từ đến n Hệ thống giao thông vùng gồm m (m ≤ n(n-1)) tuyến đường chiều khác nhau, tuyến đường thứ j (j = 1, 2, , m) cho phép từ địa điểm uj đến địa điểm vj với chi phí lại là số nguyên dương c(uj,vj) Công ty vừa nhận hợp đồng yêu cầu xây dựng hành trình du lịch xuất phát từ địa điểm du lịch và thăm k địa điểm du lịch s 1, s2, , sk (sp ≠1 với p = 1, 2, , k) sau đó quay địa điểm du lịch với tổng chi phí (được tính là tổng chi phí các tuyến đường mà hành trình qua) nhỏ 2/3 (3) Yêu cầu: Cho thông tin hệ thống giao thông và k địa điểm du lịch s1, s2, , sk Hãy xây dựng hành trình du lịch xuất phát từ địa điểm du lịch và thăm k địa điểm du lịch s1, s2, , sk sau đó quay địa điểm du lịch với tổng chi phí nhỏ Dữ liệu: Vào từ file văn TOUR.INP theo khuôn dạng sau: • Dòng thứ chứa ba số nguyên dương n, m và k; • Dòng thứ hai chứa k số nguyên dương • Dòng thứ số dòng chứa ba số nguyên dương cho biết thông tin tuyến đường thứ Giả thiết là uj≠vj; c(uj,vj) ≤ 109 với Kết quả: Ghi file văn TOUR.OUT số nguyên là tổng chi phí nhỏ tìm Qui ước: Ghi số -1 không tìm hành trình du lịch thoả mãn yêu cầu Ví dụ: TOUR.INP 682 25 124 242 433 314 415 355 531 567 TOUR.OUT 19 Hình minh hoạ Ràng buộc: - Có 50% số test ứng với 50% số điểm bài có và - Có 50% số test khác ứng với 50% số điểm còn lại bài có và Hết Họ tên thí sinh:………………………… SBD:…………………………………… Giám thị số 1:……………….…… Giám thị số 2:………………….… Ghi chú : - Thí sinh không sử dụng tài liệu - Cán coi thi không giải thích gì thêm SỞ GD&ĐT LÀO CAI ĐĐ CHÍNH THĐC KỲ THI CHỌN ĐỘI TUYỂN DỰ THI HSG QUỐC GIA THPT NĂM 2016 Hướng dẫn chấm - MÔN: Tin học ( Hướng dẫn chấm gồm 09 trang ) 3/3 (4) Cách 1: Giám khảo cho chảy chảảng trình cảa thí sinh vải lản lảảt file input và so sánh vải file out cảa ảáp án, ảúng thì cho ảiảm theo thang ảiảm không ảúng thì không cho ảiảm Cách 2: Copy bài thí sinh vào chảảng trình chảm tả ảảng THEMIS có sản ảảa CD, chảy chảảng trình chảm - Chú ý kiảm tra nhảng bài luôn cho mảt kảt và nhảng bài bả ảiảm Bài 1: Nải dây (6 điểm) Có 20 test = 0.3 x 20 = điểm Bài 2: Số nguyên tố (7 điểm) Có 20 test = 20 x 0.35 = điểm Bài 3: Hành trình du lịch (7 điểm) Có 20 test = 20 x 0.35 = điểm type truyvan=record end; l,r:longint; const nmax=1000001; xmax=100001; qmax=50010; fi='PRIME.INP'; fo='PRIME.OUT'; var q:array[1 qmax]of truyvan; c,f,temp:array[0 nmax]of longint; n,m:longint; procedure doc; var i,x,l,r:longint; fin:text; begin assign(fin,fi); reset(fin); readln(fin,n); for i:=1 to n 4/3 (5) begin read(fin,x); c[x]:=c[x]+1; end; readln(fin); readln(fin,m); for i:=1 to m begin readln(fin,l,r); if (l>nmax) then l:=nmax; if (r>nmax) then r:=nmax; q[i].l:=l; q[i].r:=r; end; end; procedure sang_ngto; var i,j:longint; begin temp[0]:=1; temp[1]:=1; for i:=2 to xmax if temp[i]=0 then begin j:=i; while j<=xmax begin temp[j]:=1; f[i]:=f[i]+c[j]; end; j:=j+i; end; end; 5/3 (6) procedure init; var i:longint; begin sang_ngto; for i:=2 to xmax f[i]:=f[i]+f[i-1]; for i:=1 to nmax c[i]:=0; end; procedure ghi; var i,l,r:longint; fou:text; begin assign(fou,fo); rewrite(fou); for i:=1 to m begin l:=q[i].l; r:=q[i].r; if (l>xmax) then l:=xmax; if (r>xmax) then r:=xmax; end; end; writeln(fou,f[r]-f[l-1]); close(fou); BEGIN doc; init; ghi; END {$MODE OBJFPC} program Task; const 6/3 (7) InputFile = 'TERA.INP'; OutputFile = 'TERA.OUT'; maxN = 1000; maxL = Round(1E9); type TArray1 = array[1 maxN] of Integer; TArray2 = array[1 maxN * maxN] of Integer; var fi, fo: TextFile; a, b, c, d: TArray1; v, f: TArray2; n, m, L: Integer; procedure Enter; var i: Integer; begin ReadLn(fi, n, L); for i := to n Read(fi, a[i]); ReadLn(fi); for i := to n Read(fi, b[i]); ReadLn(fi); for i := to n Read(fi, c[i]); ReadLn(fi); for i := to n Read(fi, d[i]); ReadLn(fi); end; procedure Sort(L, H: Integer); var i, j: Integer; pivot: Integer; 7/3 (8) begin if L >= H then Exit; i := L + Random(H - L + 1); pivot := v[i]; v[i] := v[L]; i := L; j := H; repeat while (v[j] > pivot) and (i < j) Dec(j); if i < j then begin v[i] := v[j]; Inc(i); end else Break; while (v[i] < pivot) and (i < j) Inc(i); if i < j then begin v[j] := v[i]; Dec(j); end else Break; until i = j; v[i] := pivot; Sort(L, i - 1); Sort(i + 1, H); end; procedure BuildVF; var i, j, k, value, freq: Integer; begin k := 0; for i := to n for j := to n begin Inc(k); 8/3 (9) v[k] := a[i] + b[j]; end; Sort(1, k); while (k > 0) and (v[k] > maxL) Dec(k); //for optimization, no need m := 0; j := 0; for i := to k if (i = k) or (v[i] <> v[i + 1]) then begin Inc(m); v[m] := v[i]; f[m] := i - j; j := i; end; end; function Search(value: Integer): Integer; var low, middle, high: Integer; begin low := 1; high := m; while low <= high //v[low - 1] < value <= v[high + 1] begin middle := (low + high) shr 1; if v[middle] < value then low := Succ(middle) else high := Pred(middle); end; if (low <= m) and (v[low] = value) then Result := f[low] else 9/3 (10) Result := 0; end; function Solve: Int64; var i, j, value: Integer; begin Result := 0; for i := to n for j := to n begin value := c[i] + d[j]; if value <= L then Result := Result + Search(L - value); end; end; begin AssignFile(fi, InputFile); Reset(fi); AssignFile(fo, OutputFile); Rewrite(fo); try Enter; BuildVF; WriteLn(fo, Solve); finally CloseFile(fi); CloseFile(fo); end; const end FI='tour.inp'; FO='tour.out'; var 10/3 (11) f: text; n,m,k,hs: longint; best: array[0 100000,0 16] of int64; heap,heap_id: array[0 2001] of int64; u,v,ke,cost,c: array[0 1000100] of longint; tro,s: array[0 2001] of longint; kc: array[0 1001,0 1001] of int64; d: array[0 1001] of int64; kq,max: int64; procedure doc; var i: longint; begin assign(f,FI); reset(f); readln(f,n,m,k); max:=1000000000000000; for i:=1 to k read(f,s[i]); for i:=1 to m readln(f,u[i],v[i],c[i]); fillchar(tro,sizeof(tro),0); for i:=1 to m inc(tro[u[i]]); inc(tro[1]); for i:=2 to n tro[i]:=tro[i-1]+tro[i]; for i:=1 to m begin dec(tro[u[i]]); ke[tro[u[i]]]:=v[i]; cost[tro[u[i]]]:=c[i]; end; tro[n+1]:=m+1; close(f); end; 11/3 (12) procedure heap_swap(i,j: longint); var t: longint; begin heap_id[heap[i]]:=j; heap_id[heap[j]]:=i; t:=heap[i]; heap[i]:=heap[j]; heap[j]:=t; end; procedure heap_up(i: longint); begin if (i=1) or (d[heap[i div 2]] <= d[heap[i]]) then exit; heap_swap(i,i div 2); heap_up(i div 2); end; procedure heap_down(i: longint); var j: longint; begin j:=2*i; if (j>hs) then exit; if (j<hs) and (d[heap[j]]>d[heap[j+1]]) then inc(j); if d[heap[i]]<=d[heap[j]] then exit; heap_swap(i,j); heap_down(j); end; procedure heap_push(v: longint); begin inc(hs); 12/3 (13) heap[hs]:=v; heap_up(hs); end; procedure heap_pop(i: longint); begin heap_swap(i,hs); dec(hs); heap_down(i); heap_up(i); end; procedure dijkstra(start: longint); var i,j,k,u: longint; fixed: array[0 1001] of boolean; begin //khoi tao for i:=1 to n d[i]:=max; d[start]:=0; hs:=0; for i:=1 to n begin heap_id[i]:=i; heap_push(i); end; fillchar(fixed,sizeof(fixed),false); // tinh d[i]; for i:=1 to n begin j:=heap[1]; heap_pop(1); 13/3 (14) fixed[j]:=true; for k:=tro[j] to tro[j+1]-1 begin u:=ke[k]; if (not fixed[u]) and (d[u]>d[j]+cost[k]) then begin d[u]:=d[j]+cost[k]; heap_up(heap_id[u]); end; end; end; end; procedure xuli; var i,j,T,x: longint; begin s[0]:=1; for i:=0 to k begin dijkstra(s[i]); for j:=1 to n kc[s[i],j]:=d[j]; end; //======================================= for i:=1 to k begin T:=0; T:=T or (1 shl (i-1)); best[T,i]:=kc[1,s[i]]; end; for T:=1 to (1 shl k)-1 14/3 (15) if (T and (-T))<>T then begin for i:=1 to k begin if (T shr (i-1)) and = then begin x:=T and (not(1 shl (i-1))); best[T,i]:=max; for j:=1 to k if (x shr (j-1)) and = then begin if best[x,j]+kc[s[j],s[i]]<best[T,i] then best[T,i]:=best[x,j]+kc[s[j],s[i]]; end; end; end; end; //===================================================== kq:=max; for i:=1 to k if best[(1 shl k)-1,i]+kc[s[i],1]<kq then kq:=best[(1 shl k)-1,i]+kc[s[i],1]; end; procedure ghi; begin assign(f,FO); rewrite(f); if kq=max then writeln(f,-1) else writeln(f,kq); close(f); end; 15/3 (16) begin doc; xuli; ghi; end 16/3 (17)

Ngày đăng: 25/09/2021, 02:58

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan