1. Trang chủ
  2. » Giáo án - Bài giảng

DAPAN DE DE XUAT

12 3 0

Đ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

Thông tin cơ bản

Định dạng
Số trang 12
Dung lượng 136 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Biết rằng, các thứ tự này là khác nhau Output: Đưa dữ liệu ra tệp chocolate.out, số mảnh nhỏ nhất mà thanh sô cô la đầu tiên bị phá vỡ để sau khi sắp xếp lại các phần này, ta có được số

Trang 1

TRƯỜNG THPT CHUYÊN LÊ HỒNG PHONG ĐỀ THI ĐỀ XUẤT MÔN TIN HỌC KHỐI 11

NĂM 2022

Thời gian làm bài 180 phút

( Đề thi có 03 trang, gồm 03 câu)

chương trình

Tên tệp dữ liệu

Tên tệp kết quả

Sô cô la Chocolate.* chocolate.inp chocolate.out

* là kí hiệu phần mở rộng của chương trình viết bằng ngôn ngữ lập trình C++

(cpp) hoặc Pascal (pas)

Bài 1 (6 điểm) Sô cô la

Sô cô la do công ty X sản xuất có dạng là một thanh dài, có kích thước 1xN, được tạo thành bởi N hình vuông Trên mỗi hình vuông lại in một khung cảnh theo mẫu, thuộc về đúng một trong N mẫu khung cảnh khác nhau do công ty X sản xuất

Mỗi thanh sô cô la có thể khác nhau về thứ tự xuất hiện của các khung cảnh trong N mẫu khung cảnh

Yêu cầu bài toán: Viết chương trình xác định số mảnh ít nhất mà thanh sô cô la đầu

tiên cần được bẻ ra để tạo thành thanh sô cô la thứ hai bằng cách sắp xếp lại các mảnh này Chỉ được phép phá vỡ một ô dọc theo đường viền của thanh sô cô la, và không được lật lại một ô hoặc các phần của thanh sô cô la này

Input: Dữ liệu vào từ tệp chocolate.inp, dòng đầu tiên gồm số tự nhiên N (

5

2≤ ≤N 10 ), mô tả kích thước của thanh sô cô la, tức là số ô vuông trong đó Tất cả các khung cảnh in trên thanh sô cô la được đánh số từ 1 tới N Dòng thứ hai và dòng thứ ba của tệp, mỗi dòng đều gồm N số tự nhiên khác nhau (tất cả các số đều không vượt quá N), mô tả thứ tự các mẫu khung cảnh in trên 1 ô vuông của thanh sô cô la thứ nhất và thứ hai, tương ứng Biết rằng, các thứ tự này là khác nhau

Output: Đưa dữ liệu ra tệp chocolate.out, số mảnh nhỏ nhất mà thanh sô cô la đầu

tiên bị phá vỡ để sau khi sắp xếp lại các phần này, ta có được số thứ tự các khung cảnh được in trên thanh sô cô la thứ hai

Chocolate2.inp Chocolate2.out Giải thích

5

4 3 2 5 1

có thể được chia thành bốn phần: hình vuông

ĐỀ THI ĐỀ XUẤT

Trang 2

1 2 5 3 4 4, hình vuông 3, hai

hình vuông 2 và 5, hình vuông 1 Bằng cách sắp xếp lại các phần này vào đúng vị trí, ta sẽ thu được thứ tự các khung cảnh trên thanh

sô cô la thứ hai

Giới hạn:

Subtask 1 20% số điểm của bài tương ứng với 2≤ ≤N 3

Subtask 2 20% số điểm của bài tương ứng với 3< ≤N 6

Subtask 3 30% số điểm của bài tương ứng với 6< ≤N 1000

Subtask 4 30% số điểm của bài tương ứng với 5

1000< ≤N 10

Bài 2 (7 điểm) Trung tâm mua sắm

Công ty X chuẩn bị xây dựng tòa nhà trên một mảnh đất hình vuông có diện tích là NxN mét vuông Có một số giới hạn nhất định về chiều cao của tòa nhà Nếu chia mảnh đất thành các ô vuông theo chiều dọc và chiều ngang, mỗi ô vuông rộng 1 mét, thì toàn bộ tòa nhà của trung tâm mua sắm sẽ nằm trong một phần có giới hạn về chiều cao Các kiến trúc sư muốn xây dựng tòa nhà theo hình dạng của một hình hộp chữ nhật

Yêu cầu bài toán: Viết một chương trình biết kích thước của mảnh đất và giới hạn

chiều cao cho mỗi ô đất, tìm thể tích lớn nhất của một tòa nhà hình hộp chữ nhật có thể được xây dưng trên mảnh đất này

Input: Dữ liệu vào từ tệp shopping.inp gồm ba dòng Dòng đầu tiên gồm số nguyên N

2≤ ≤N 5 10x ) Dòng thứ hai gồm N số nguyên không âm, mỗi số không vượt quá

105, đó là giới hạn chiều cao cho từng ô đất theo chiều dọc Dòng thứ ba gồm N số nguyên không âm, mối số không vượt quá 105, đó là giới hạn chiều cao cho từng ô đất theo chiều ngang

Output: Dữ liệu đưa ra tệp shopping.out, gồm một số duy nhất, đó là thể tích tối đa

của tòa nhà trung tâm mua sắm có thể được xây dựng trên một mảnh đất đã cho Dữ liệu đầu vào đảm bảo có thể xây dựng được tòa nhà có thể tích khác 0 trên mảnh đất này

shopping.inp Shopping.out 3

0 1 0

0 2 0

1

3

3 2 1

1 2 3

9

Giới hạn:

Subtask 1 10% số điểm của bài tương ứng với 1≤ ≤N 10

Trang 3

Subtask 2 10% số điểm của bài tương ứng với 10< ≤N 30

Subtask 3 10% số điểm của bài tương ứng với 30< ≤N 70

Subtask 4 30% số điểm của bài tương ứng với 70< ≤N 1000

Subtask 5 40% số điểm của bài tương ứng với 1000< ≤N 5.104

Bài 2 (7 điểm) Đường đi ngắn nhất

Đảo X gồm Nx thành phố, một số cặp thành phố được nối với nhau bằng con đường hai chiều Mỗi con đường có một độ dài riêng Tổng số con đường trong cả đảo

X là Mx, biết rằng từ mỗi thành phố của đảo X có thể đi bằng đường bộ đến mọi thành phố khác trên đảo này Các thành phố của đảo X được đánh số từ 1 tới Nx

Tương tự, đảo Y gồm Ny thành phố, một số cặp thành phố được nối với nhau bằng con đường hai chiều Mỗi con đường có một độ dài riêng Tổng số con đường trong cả đảo Y là My, biết rằng từ mỗi thành phố của đảo Y có thể đi bằng đường bộ đến mọi thành phố khác trên đảo này Các thành phố của đảo Y được đánh số từ 1 tới Ny

Quốc gia XY bao gồm N=Nx.Ny thành phố, mỗi thành phố của quốc gia XY có thể gán tương ứng 1-1 với một cặp thành phố (x,y) ở đảo X và đảo Y, với x là thành phố ở đảo X, và y là thành phố ở đảo Y Một cặp thành phố của quốc gia XY cũng được nối với nhau bằng con đường hai chiều Có đúng M=Nx.My+Ny.Mx con đường trên quốc gia XY Con đường giữa thành phố (x1,y1) và (x2,y2) được định nghĩa như sau:

1 Nếu x1=x2, và có một con đường nối giữa các thành phố y1 và y2 của đảo Y

Độ dài của đường đi giữa thành phố (x,y1) và (x,y2) bằng độ dài của con đường nối giữa các thành phố y1 và y2

2 Nếu y1=y2, và có một con đường nối giữa các thành phố x1 và x2 của đảo X

Độ dài của đường đi giũa các thành phố (x1,y) và (x2,y) bằng độ dài đường đi giữa các thành phố x1 và x2

Các thành phố của của các đảo khác nhau không được nối với nhau bằng đường bộ

Yêu cầu bài toán: Bài toán này gồm có hai yêu cầu

Yêu cầu 1 Xác định độ dài của con đường ngắn nhất dọc theo đường đi từ thành

phố (1,1) đến thành phố (Nx,Ny)

Yêu cầu 2 Một số con đường của quốc gia XY cần được đóng lại Nhiệm vụ của

bạn là xác định tổng chiều dài nhỏ nhất của những con đường còn lại ở quốc gia

XY, để từ một thành phố bất kỳ có thể tới được một thành phố bất kỳ nào khác

Input: Dữ liệu vào từ tệp cartesius.inp, dòng đầu tiên là yêu cầu cần giải (1 hoặc

2) Dòng thứ hai gồm các số tự nhiên Nx và Mx (1≤ Nx≤5.10 ,14 ≤Mx≤5.104),

số thành phố và số con đường ở đảo X Mx dòng sau mô tả các con đường ở đảo X: mỗi dòng gồm ba số, trong đó hai số đầu mô tả con đường nối giữa hai thành phố, và số thứ ba là chiều dài con đường (một số tự nhiên không vượt quá 107) Dòng tiếp theo của tệp đầu vào gồm các số tự nhiên Ny và My (

1≤Ny≤5.10 ,1≤My≤5.10 ), số thành phố và số con đường ở đảo Y Những

Trang 4

dòng sau mô tả về các con đường ở đảo Y, với những ràng buộc tương tự như mô

tả về các con đường ở đảo X

Ouput: Đưa dữ liệu ra tệp cartesius.out, gồm một số nguyên, câu trả lời cho câu

hỏi của bài toán

cartesius.inp cartesius.out 1

3 2

2 1 15

3 1 14

3 2

2 1 15

3 2 15

44

2

3 2

2 1 15

3 1 14

3 2

2 1 15

3 2 15

117

Giới hạn:

Subtask 1 12% số điểm của bài tương ứng với việc giải quyết yêu cầu 1, các số Nx,

Mx, Ny,My không vượt quá 200

Subtask 2 28% số điểm của bài tương ứng với việc giải quyết yêu cầu 1, không có giới hạn thêm

Subtask 3 12% số điểm của bài tương ứng với việc giải quyết yêu cầu 2, các số Nx,

Mx, Ny,My không vượt quá 200

Subtask 4 48% số điểm của bài tương ứng với việc giải quyết yêu cầu 2, không có giới hạn thêm

Trang 5

ĐÁP ÁN ĐỀ ĐỀ XUẤT DUYÊN HẢI

MÔN TIN KHỐI 11 NĂM HỌC: 2022-2023

Bài 1 Xem xét bất kỳ hai hình vuông liền kề nào của thanh sô cô la đầu tiên Nếu trên ô thứ hai, chúng không đứng cạnh nhau và theo cùng một thứ tự, ô đầu tiên ở đường giao nhau của các ô vuông này bằng cách này hay cách khác sẽ phải phá vỡ Tuy nhiên, việc phá vỡ các ô ở tất cả những nơi như vậy chúng tôi có được các phần, mỗi phần là một mảnh của các hình vuông liên tiếp của phần thứ hai Do đó, làm theo các bước này ta có thứ tự các ô trên thanh thứ hai Vì vậy, ta phải tìm số đầu tiên và số thứ hai ô phía trước nó có cùng ý nghĩa hay không Để làm điều này, bạn có thể cho tất cả các số thực hiện tìm kiếm riêng biệt trên một hoặc cả hai ô (điều này sẽ tạo ra độ phức tạp � (�2)) Hoặc là duyệt để tạo cho một trong các

ô một mảng chỉ mục � [�], trong đó với mỗi �, 1 ⩽ � ⩽ �, theo dõi chỉ số trên ô trước � (hoặc, giả sử, 0, nếu � là chỉ số đầu tiên trên gạch) Sau đó, đi từ trái sang phải trên ô thứ hai, bạn Do đó, thuật toán sẽ hoạt động đối với O(N) thời gian

#include <bits/stdc++.h>

using namespace std;

void nhapxuat()

{

freopen("chocolate2.inp", "r", stdin);

freopen("chocolate2.out", "w", stdout);

}

#define ll long long

ll n, a[100005], b[100005];

ll pos[100005], ans;

int main()

{

nhapxuat();

ios_base::sync_with_stdio(0);

cin.tie(0); cout.tie(0);

cin >> n;

for(int i = 1; i <= n; ++i) cin >> a[i];

for(int i = 1; i <= n; ++i)

{

cin >> b[i];

pos[b[i]] = i;

}

Trang 6

int i = 1; int j = 1;

while(i <= n)

{

int temp = pos[a[i]];

while(a[j] == b[temp] && (j <= n && temp <= n)) {j++; temp++;}

ans++;

i = j;

}

cout << ans;

return 0;

}

Bài 2 Mua sắm

- Có a[i] là giới hạn của cột i, b[i] là giới hạn của hàng i

- Chọn 1 dãy con của a và 1 dãy con của b, lấy tích độ dài 2 dãy con nhân với min các giá trị trong dãy, max trong tất cả các trường hợp là thể tích lớn nhất đạt được

- D[i] là độ dài dãy con dài nhất trong a thỏa mãn giá trị nhỏ nhất trong dãy >=i

- F[i] là độ dài dãy con dài nhất trong b thỏa mãn giá trị nhỏ nhất trong dãy min >=i

- Để tính mảng d, gọi mảng x gồm n phần tử, ban đầu các giá trị trong x là -oo, duyệt mảng a theo thứ tự giảm dần của giá trị , khi xét đến a[i] thì gán x[i]=1,

- D[a[i]] = đoạn con có tổng lớn nhất trong x

- Ta có thể dùng cây it để cập nhật và truy vấn trong log(n)

Mảng f cũng tính tương tự

- Kết quả: max(f[i]*d[i]*i)

- Độ phức tạp O(n*log(n))

#include <bits/stdc++.h>

using namespace std;

#define ll long long

#define ii pair<ll,ll>

#define fi first

#define se second

const ll N=1e5+5,M=1e9;

ll n,i,d[4*N+1],L[4*N+1],R[4*N+1],s[4*N+1],c[N+1],f[N+1],ans;

vector<ii> a;

void update(ll k,ll l,ll r,ll u,ll v)

{

Trang 7

if(u<l||r<u) return;

if(l==r)

{

d[k]=L[k]=R[k]=s[k]=v;

return;

}

ll mid=(l+r)/2;

update(k*2,l,mid,u,v);

update(k*2+1,mid+1,r,u,v);

d[k]=max(d[k*2],max(d[k*2+1],R[k*2]+L[k*2+1]));

R[k]=max(R[k*2+1],s[k*2+1]+R[k*2]);

L[k]=max(L[k*2],s[k*2]+L[k*2+1]);

s[k]=s[k*2]+s[k*2+1];

}

bool cmp(ii u,ii v)

{

return u.fi>v.fi;

}

int main()

{

freopen("shopping.inp","r",stdin);

freopen("shopping.out","w",stdout);

cin>>n;a.resize(n+1);

for(i=1;i<=n;i++)

{ ll x;

cin>>x;

a[i]={x,i};

}

sort(a.begin()+1,a.end(),cmp);

for(i=1;i<=n;i++) update(1,1,n,i,-M);

for(i=1;i<=n;i++)

{

update(1,1,n,a[i].se,1);

c[a[i].fi]=max(c[a[i].fi],d[1]);

}

Trang 8

for(i=1;i<=n;i++)

{ ll x;

cin>>x;

a[i]={x,i};

}

sort(a.begin()+1,a.end(),cmp);

for(i=1;i<=n;i++) update(1,1,n,i,-M);

for(i=1;i<=n;i++)

{

update(1,1,n,a[i].se,1);

f[a[i].fi]=max(f[a[i].fi],d[1]);

}

for(i=N-1;i>=1;i )

{

f[i]=max(f[i],f[i+1]);

c[i]=max(c[i],c[i+1]);

}

for(i=1;i<=N;i++) ans=max(ans,i*f[i]*c[i]);

cout<<ans;

return 0;

}

Bài 3

Để giải quyết vấn đề một cách hiệu quả, ta sẽ trực quan hóa đồ thị của đảo X, đảo Y, quốc gia XY:

- Đặt các thành phố của đảo X là các điểm trong đoạn [1 Nx], các thành phố của đỉnh

Y là các điểm trong đoạn [1 Ny], và các thành phố của quốc gia XY là các điểm trong

hệ trục tọa độ Đề các [1 Nx]x[1 Ny]

- Như vậy, thành phố của đảo X là các điểm có tạo độ (x,0), thành phố của đảo Y là các điểm có tọa độ (0,y) và thành phố của quốc gia XY sẽ có tạo độ là (x,y)

Như vậy tập hợp Ny cạnh ngang tương ứng với bất kỳ cạnh nào của đảo X, kết nối các đỉnh của các cột tương ứng Tương tự với bất kỳ cạnh nào của đảo Y tương ứng với tập Nx cạnh thẳng đứng của hệ trục tọa độ Đề các, nối các đỉnh của các dòng tương ứng

Subtask 1: Để được 12 điểm cho bài toán này, ta có thể xây dựng một đồ thị trong chương trình như mô tả trong diều kiện và chạy thuật toán Dijikstra trên đó

Subtask 2: Để được 28 điểm còn lại, ta chú ý tính chất sau (thông qua d(a,b)-khoảng cách ngắn nhất từ thành phố a đến thành phố b

d((1, 1), (� �, � �)) = �(1, ��) + �(1, ��)

Trang 9

Điều này có thể dễ dàng chứng minh, vì bất kỳ con đường nào nối từ thành phố (x1,y1) đến thành phố (x2,y2) của quốc gia XY đều được chia thành hai con đường: giữa các thành phố x1 và x2 của đảo X và giữa các thành phố y1 và y2 của đảo y; đồng thời bất kỳ cặp đường nào giữa các thành phố x1 và x, và giữa các thành phố y1 và y2 đều có thể biến thành một con đường từ thành phố (x1,y1) đến thành phố (x2,y2) có tổng chiều dài tương ứng

: Để nhận được 12 điểm cho nhiệm vụ này, ta có thể trực tiếp xây dựng một đồ thị trong chương trình và chạy trên đố thuật toán để xây dựng cây khung nhỏ nhất

Để có được 48 điểm cuối cùng, ta cần mô phỏng thuật toán Kruskal trên đồ thị quốc gia XY (đồ thị Đề các), nhưng thêm các cạnh không phải từng cái một mà theo nhóm: trong một nhóm, hãy thêm tất cả các cạnh nối hai hàng hoặc hai cột Các cạnh từ một nhóm có cùng chiều dài, điều này cho phép bạn thêm chúng vào cùng một lúc

1 Sắp xếp các cạnh của đồ thị X và đồ thị Y theo độ dài

2 Ta tạo hai cấu trúc Disjointset cho tập các đỉnh của X và tập các đỉnh của Y

3 Sắp xếp các cạnh theo thứ tự từ ngắn nhất đến dài nhất

- Nếu cạnh thuộc đảo X và kết nối các đỉnh từ các tập khác nhau (thành phần liên thông):

- - Kết hợp các tập tương ứng trong tập disjoinset của đảo X, thêm một nhóm các cạnh nằm ngang trong quốc gia XY

- Thêm vào câu trả lời độ dài của cạnh nhân với số tập hiện tại trong tập rời rạc

(disjoinset) của đảo Y

- Nếu cạnh thuộc đảo Y và nối các đỉnh từ các tập khác nhau (thành phần liên thông):

- Kết hợp các tập tương ứng trong tập disjointset của đảo Y- thêm một nhóm các cạnh theo chiều dọc ở quốc gia XY

- Thêm vào câu trả lời độ dài của cạnh nhân với số bộ hiện tại trong tập đảo X rời rạc

- Nếu một canh kết nối từ các đỉnh của thành phần liên thông, hãy bỏ qua nó

#include <bits/stdc++.h>

using namespace std;

void nhapxuat()

{

freopen("cartesius.inp", "r", stdin);

freopen("cartesius.out", "w", stdout);

}

#define ll long long

typedef pair<ll, ll> cap;

struct dt

{

ll u, v, c, loai;

};

bool ss(dt x, dt y)

{

return (x.c < y.c);

}

ll nx, mx, ny, my, type, f[100005], n, m;

ll ux[100005], vx[100005], cx[100005];

ll uy[100005], vy[100005], cy[100005];

ll px[100005], hangx[100005], py[100005], hangy[100005];

dt a[100005];

vector< vector<cap> > gx, gy;

void sub1()

{

Trang 10

priority_queue<cap, vector<cap>, greater<cap> > q;

for(int i = 1; i <= nx; ++i)

f[i] = 1e16;

f[1] = 0;

q.push({0, 1});

while(!q.empty())

{

ll u = q.top().second;

ll w = q.top().first;

q.pop();

if(w != f[u]) continue;

for(cap x : gx[u])

{

ll v = x.first;

ll c = x.second;

if(f[v] > f[u]+c)

{

f[v] = f[u]+c;

q.push({f[v], v});

}

}

}

ll ans = f[nx];

for(int i = 1; i <= ny; ++i)

f[i] = 1e16;

f[1] = 0;

q.push({0, 1});

while(!q.empty())

{

ll u = q.top().second;

ll w = q.top().first;

q.pop();

if(w != f[u]) continue;

for(cap x : gy[u])

{

ll v = x.first;

ll c = x.second;

if(f[v] > f[u]+c)

{

f[v] = f[u]+c;

q.push({f[v], v});

}

}

}

cout << ans+f[ny];

}

int rootx(int x)

{

if(x == px[x]) return x;

else return px[x] = rootx(px[x]);

}

int rooty(int y)

{

if(y == py[y]) return y;

else return py[y] = rooty(py[y]);

Ngày đăng: 21/10/2022, 00:04

w