Đề thi, Bộ test, chương trình viết bằng NNLT C++ kèm theo file hướng dẫn chi tiết cách làm các bài có trong đề thi. Các bạn chỉ cần tải về làm thử hoặc cho HS làm thử, sau đó dùng chương trình chấm tự động Themis để chấm. Bài nào chưa được full điểm các bạn có thể xem hướng dẫn cách làm và code mẫu. Xin cảm ơn
Trang 4HƯỚNG DẪN GIẢI ĐỀ THI
File này mình chỉ share hướng dẫn làm Bài 1 thôi nhé Bạn nào muốn có tất cả các bài thì tải file hướng dẫn về xem
Bài 1: Ta tóm tắt lại đề một chút nhé
Cả khu phố có N người
Có a người biết thực hiện tốt việc cách ly (Lưu ý biết thực hiện tốt việc cách ly nhưng chưa chắc đã thực hiện cách ly tốt, cũng như biết mà không làm ấy)
Cán bộ y tế chỉ ghi được b người thực hiện việc cách ly không tốt (như vậy b này có thể là tất cả những người trong khu phố thực hiện việc cách ly không tốt hoặc chỉ là một phần trong số những người thực hiện việc cách ly không tốt)
Ta có hình vẽ sau:
Dựa vào 2 hình vẽ trên ta có cách tìm số người tối thiểu và số người tối đa thực hiện tốt việc cách ly như sau:
- Số người tối thiểu thực hiện tốt việc cách ly khi số người biết cách thực hiện cách ly nhưng không thực hiện tốt việc cách ly nhiều nhất Tức là số lượng người
mà cán bộ y tế ghi được thuộc nhóm a nhiều nhất Do đó ta có cách tính tối thiểu như sau:
Nếu b>a thì
toithieu=0 (cả a người biết thực hiện tốt cách ly nhưng không người nào trong
số a người này thực hiện tốt việc cách ly)
ngược lại
toithieu=a-b (cả b người không thực hiện tốt cách ly mà cán bộ y tế ghi được đều nằm trong nhóm a người, tức đều là những người biết thực hiện cách ly)
- Số người tối đa thực hiện tốt việc cách ly khi số người biết cách thực hiện cách ly
và thực hiện tốt việc cách ly nhiều nhất Tức là số người mà cán bộ y tế ghi được
Trang 5thuộc nhóm a ít nhất
Nếu b>N-a thì
toida=N-b (có một số người biết thực hiện cách ly nhưng thực hiện không tốt) ngược lại
toida=a (cả a người biết thực hiện cách ly đều thực thực hiện tốt)
CODE Bài 1
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ifstream fi;
ofstream fo;
ll n,a,b,toithieu,toida;
int main()
{
fi.open("BAI1.INP");
fi>>n>>a>>b;
fi.close();
fo.open("BAI1.OUT");
if (a>b)
toithieu=a-b;
else
toithieu=0;
if (b>n-a)
toida=a-(b-(n-a));
else
toida=a;
fo<<toithieu<<" "<<toida;
return 0;
}
Trang 6CODE Bài 2:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ifstream fi;
ofstream fo;
string s;
ll n,na,nb,x,i,j,kq;
char a[1000001],b[1000001];
ll c[1000001],d[1000001]; int main()
{
fi.open("BAI2.INP"); getline(fi,s);
n=s.size();
s=s+" ";
na=0;
x=1;
for (i=0;i<=n;i++)
if (s[i]!=s[i+1]) {
na++;
a[na]=s[i]; c[na]=x; x=1;
} else
x++;
/////
getline(fi,s);
n=s.size();
s=s+" ";
nb=0;
x=1;
for (i=0;i<=n;i++)
if (s[i]!=s[i+1]) {
nb++;
b[nb]=s[i]; d[nb]=x; x=1;
} else
x++;
/////
i=1;
Trang 7j=1;
kq=0;
while (i<=na && j<=nb)
if (a[i]==b[j] && c[i]>=d[j]) {
if (a[i]==' ')
kq++;
i++;
j++;
} else {
while (a[i]!=' ')
i++;
while (b[j]!=' ')
j++;
i++;
j++;
} fo.open("BAI2.OUT");
fo<<kq;
fo.close();
return 0;
}
Trang 8CODE Bài 3:
#include<bits/stdc++.h>
using namespace std;
ifstream fi;
ofstream fo;
long long n,i,j,k,d,c,g,vt,kq,a[100001],b[100001],x[100001]; int main()
{
fi.open("BAI3.INP");
fi>>n>>k;
for(i=1;i<=n;i++)
fi>>a[i];
fi.close();
fo.open("BAI3.OUT");
sort(a+1,a+1+n,greater<long long>());
j=1;
kq=0;
for(i=1;i<=n;i++)
{
if (b[i]==0)
kq=kq+a[i];
while (j<=n && (a[i]-a[j]<k || b[j]==1))
j++;
if (j>n) {
for (j=i+1;j<=n;j++)
if (b[j]==0)
kq=kq+a[j];
break;
} else
b[j]=1;
}
fo<<kq;
return 0;
}
Trang 9CODE Bài 4:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ifstream fi;
ofstream fo;
ll l,r,i,j,x,n,m,kq;
ll d[1000001],a[1000001];
int main()
{
n=1000000;
m=sqrt(n);
d[1]=1;
for (i=2;i<=m;i++)
if (d[i]==0)
for (j=2*i;j<=n;j=j+i)
d[j]=1;
m=0;
for (i=1;i<=n;i++)
if (d[i]==0) {
m++;
a[m]=i;
} fi.open("BAI4.INP");
fi>>l>>r;
fi.close();
for (i=1;i<=m;i++)
{
x=a[i]*a[i];
j=2;
while (x<r) {
if (x>l && d[j+1]==0) {
kq++;
cout<<x<<' '; }
j++;
x=x*a[i];
} }
fo.open("BAI4.OUT");
fo<<kq;
fo.close();
return 0;
}
Trang 10CODE Bài 5:
#include<bits/stdc.h>
using namespace std;
#define ll long long
ifstream fi;
ofstream fo;
ll n,i,j,a[1000001],b[1000001],s,nn;
int main()
{
fi.open("BAI5.INP");
fi>>n;
for(i=1;i<=n;i)
fi>>a[i];
fi.close();
for (i=1;i<=9;i)
b[i]=b[i-1][i];
for (i=10;i<=n;i)
{
b[i]=b[i-1][i];
s=a[i];
nn=a[i];
for (j=i-9;j<i;j) {
s=s[j];
if (nn>a[j])
nn=a[j];
} b[i]=min(b[i],b[i-10]nn);
}
fo.open("BAI5.OUT");
fo<<b[n];
fo.close();
return 0;
}
Trong file đính kèm mình có để 2 bộ code Một bộ code do mình hướng dẫn HS làm theo thuật toán trên (C++) và một bộ code của học sinh được 20/20 điểm cho các bạn tham khảo
Trang 11Dưới đây là hình ảnh chấm điểm bằng Themis
Các bạn có thể xem thêm nhiều đề khác tại
https://sites.google.com/view/dethi-hsgtin/trang-ch%E1%BB%A7/%C4%91%E1%BB%81-thi-hsg-thpt
Rất mong nhận được sự góp ý và ủng hộ Cảm ơn