• Embed Doc
  • Readcast
  • Collections
  • CommentGo Back
Download
 
Gói lệnh olympiad.sty
Nguyễn Hữu Điển
Khoa Toán - Cơ - Tin họcĐHKHTN Hà Nội, ĐHQGHN
Mục lục
1. Gii thiu .......................................................... 12. Đưa vào phn đu gói lnh ......................................... 13. Cu trúc mt đthi ................................................ 24. Mt ví dtht ..................................................... 25. Kết lun ........................................................... 4
1. Gii thiệu
Nhằm mục đích soạn đề thi tin học và tuyển tập các bài tập về tin học, sách về tin học màtôi chuẩn bị soạn thảo với các chương trình bằng các ngôn ngữ lập trình khác nhau,... Tôiđã soạn ra gói lệnh này có thể làm:
Đề thi học sinh giỏi tin hoc.
Làm tuyển tập và sách về các bài tập tin học.
Làm các báo, tập san tin học.Dùng gói lệnh này với gói lệnh listings.sty bắt buộc.
2. Đưa vào phần đầu gói lệnh
1. Gói lệnh đưa vào phần đầu
\usepackage{listings}\usepackage{expdlist}\usepackage[all]{xy}\usepackage[vietex,norunhead]{olympiad}
1. Tùy chọn [vietex] dùng cho tiếng Việt2. Tùy chọn [norunhead] không làm tiêu đề chạy từ trang thứ hai khi làm sách, tuyểntập, mặc định là làm tạp chí.
\lstset{language=C++,emph={printf,*},emphstyle=\bf,numbers=left,xleftmargin=16pt, numberblanklines=false, numberstyle=\footnotesize,numbersep=5pt, tabsize=2}
Đặt đánh số mã chương trình.1
 
3. Cấu trúc một đề thi
Cấu trúc một đề thi gồm các phần
\begin{problem}{<Tên bài>}{<Xuất xứ, tác giả bài tập>}<Nội dung bài tập>\InputFile<Mô tả tệp vào>\OutputFile<Mô tả tệp ra>\Example\begin{example}{<Tên tệp vào>}{<Tên tệp ra>}\exmp{<Các dòng tệp vào>}{<Các dòng tệp ra>}%\end{example}\end{problem}
4. Một dthtBài toán 1. Đếm điểm
Được lấy từ http://nhdien.wordpress.com
Trong mặt phẳng cho
n
điểm
A
i
(
x
i
,y
i
)
,i
= 1
,
2
,...,n
là các đỉnh của đa giác
A
1
A
2
...A
n
.Hãy viết chương trình points.exe tìm số lượng các điểm có tọa độ nguyên nằm trong hoặcnằm trên các cạnh của đa giác đã cho.
Định dạng tệp vào
Dữ liệu đầu vào theo tệp tiêu chuẩn: Dòng đầu tiên là số
n
.
n
dòng tiếp theo, mỗi dònglần lượt chứa cặp tọa độ
x
i
,y
i
,i
= 1
,
2
,...,n
là những số nguyên, phân biệt nhau bởi dấucách.
Định dạng tệp ra
Số lượng tìm được đưa ra tệp chuẩn.Giới hạn bài toán:
3
n
1000
,
x
i
y
i
là các số nguyên trong khoảng
[
10
4
,
10
4
]
.
Ví dụ
point.in point.out
50 05 05 33 21 420
2
 
Phân tích.
Kí hiệu diện tích của đa giác là
. số lượng các điểm tọa độ nguyên trên cáccạnh của tứ giác là
B
, số điểm tọa độ nguyên bên trong tứ giác là
. Trong hình học tổ hợpcó công thức phụ thuộc sau:
=12
B
+
1
.
Có những thuật toán dễ dàng tìm được các điểm tọa độ nguyên trên biên của đa giác vàcũng như diện tích của đa giác. Nhờ công thức trên ta tính được số điểm có tọa độ bêntrong đa giác và bài toán như vậy được giải.Diện tích của đa giác được tìm bằng công thức tính tổng của tích:
(
x
j
x
j
+1
)
(
y
j
+
y
j
+1
)
với
j
= 1
,
2
,...,N 
(
+ 1
trùng với
1
). Thuật toán này có độ phức tạp
O
(
)
. Kết quả tínhtổng trên lấy giá trị tuyệt đối cho ta hai lần diện tích của đa giác.Tìm các điểm nguyên trên các cạnh đa giác ta thực hiện tìm chúng trong mọi cạnh vàcộng thêm
(các điểm đỉnh của tứ giác). Ta biết rằng số lương các điểm nguyên trên mộtđoạn thẳng bằng ước số chung lớn nhất của hai hiệu tọa độ
x
y
ở hai đầu đoạn thẳng trừđi
1
. Nghĩa là ta sẽ có tổng
gcd
(
|
x
j
x
j
+1
|
,y
j
y
j
+1
)
1
với
j
= 1
,
2
,...,N 
(
+ 1
tươngđương với
1
), ở đây kí hiệu
gcd
là hàm ước số chung lớn nhất.
Phương án cài đặt.
Listing 1: demdiem.c
1
#include
<cstdio>
2
#include
<algorithm>
3
using namespace
std ;
4
const int
maxn = 1001;
5
struct
Point
6
{
7
int
x , y ;
8
};
9
int
n;
10
Point ps [maxn] ;
11
void
solve ();
13
int
main()
14
{
15
solve ();
16
return
0;
17
}
19
void
solve ()
20
{
21
int
i , a2 , b;
22
int
area2 ();
23
int
border ();
24
scanf ("%d" , &n);
25
for
( i = 0; i < n; i++)
26
scanf ("%d%d" , &ps [ i ] . x , &ps [ i ] . y );
27
ps [n] = ps [ 0 ] ;
28
a2 = area2 ();
29
b = border ();
30
i = (a2
b + 2) / 2;
31
printf 
("%d\n" , b + i );
32
}
34
int
area2 ()
35
{
36
int
i , a ;
37
for
( i = a = 0; i < n; i++)
38
a += (ps [ i ] . x
ps [ i +1].x)
(ps [ i ] . y
39
+ ps [ i +1].y );
40
return
abs(a );
3
of 00

Leave a Comment

You must be to leave a comment.
Submit
Characters: ...
You must be to leave a comment.
Submit
Characters: ...