Tuyển tập 1 số đề thi và code các kỳ thi OLP tin học sinh viên toàn quốc

Ở miền Trung thường năm nào cũng có những đợt hạn hán nên ông Nam có những thùng

dự trữ nước. Do mua làm nhiều đợt nên N (1 ≤ N ≤ 1000) thùng chứa nước của ông Nam có kích

thước khác nhau, mỗi thùng có sức chứa Ci (1 ≤ Ci ≤ 10000, 1 ≤ i ≤ N). Dự đoán rằng năm nay

sẽ có đợt hạn hán lớn nên ông Nam muốn đổ đầy nước hết các thùng để dự trữ. Sau khi kiểm tra

ông Nam thấy rằng có một số thùng vẫn còn đầy, một số khác thì vơi đi một phần, còn một số thì

đã hết. Ông quyết định các thùng nào chưa đầy thì sẽ chở đi để đổ đầy nước. Nhưng do nơi lấy

nước rất xa, và mỗi lần chỉ chở đi được 1 thùng nên ông quyết định sẽ san nước giữa các thùng

với nhau để số thùng phải chở đi là ít nhất

Yêu cầu:

Cho dung lượng nước hiện có của thùng thứ i là Bi (0 ≤ Bi ≤ Ci, 1 ≤ i ≤ N), hãy giúp ông Nam

xác định số lượng thùng ít nhất phải mang đi.

Dữ liệu: vào từ file văn bản WATER.INP có dạng sau:

• Dòng thứ nhất ghi một số tự nhiên N là số lượng các thùng nước.

• Dòng thứ i trong N dòng tiếp theo mỗi dòng có 2 số nguyên Bi và Ci (0 ≤ Bi ≤ Ci) mô tả thông

tin thùng thứ i, với Bi là nước còn trong thùng và Ci là sức

chứa của thùng, các số cách nhau ít nhất một khoảng trắng.

Kết quả: ghi ra file văn bản WATER.OUT chứa một số là số lượng ít nhất các

thùng nước tìm được.

Kết quả: ghi ra file văn bản WATER.OUT chứa một số là số lượng ít nhất các

thùng nước tìm được

pdf44 trang | Chuyên mục: Phân Tích & Thiết Kế Thuật Toán | Chia sẻ: tuando | Lượt xem: 732 | Lượt tải: 0download
Tóm tắt nội dung Tuyển tập 1 số đề thi và code các kỳ thi OLP tin học sinh viên toàn quốc, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 
{ 
 int OLP=0,nn=n; 
 while (nn) 
 { 
 if(l->ci >= 0 && c[l->ci].count>0 ) 
 c[l->ci].ed=true; 
 int k=0; 
 while (!c[k].ed) k++; 
 //cout << k<<endl; 
Ngoâ Ñaêng Hieàn – Hoïc Vieän Haûi Quaân 2011 
37 
 l->ci=k; 
 l=l->next; 
 if (k<n) 
 { 
 c[k].count--; 
 if (!c[k].count) 
 nn--; 
 c[k].ed=false; 
 } 
 OLP++; 
 } 
 return OLP; 
} 
int main() 
{ 
 ifstream infile("el.txt"); 
 infile >> n >>m; 
 nodemang *c; 
 c=new nodemang[n+1]; 
 for(int i=0; i<n; i++) 
 infile>>c[i].count; 
 // sap xep 
 for (i=0; i<n-1; i++) 
 for (int j=i+1; j<n;j++) 
 if (c[i].count<c[j].count) 
 { 
 nodemang t=c[i]; 
 c[i]=c[j]; 
 c[j]=t; 
 } 
 nodevong* l=NULL; 
 tao_vong(l,m); 
 cout << tinhthoigian(l,c)<<endl; 
 return 0; 
} 
Bài: Dãy số (Ko chuyên 2009) 
Cho dãy số gồm n số nguyên a1, a2, , an. Tìm giá trị lớn nhất của hàm 
f (i,j,k)= ai +2× aj +3× ak với 1 ≤ i < j < k ≤ n. 
Ví dụ: với dãy gồm 5 số -1, 2, -2, -3, 5 thì f (1,2,5)=-1+2×2+3×5=18 là lớn nhất. 
Dữ liệu: Vào từ file văn bản SEQUENCE.INP: 
• Dòng đầu tiên chứa số nguyên n (3 ≤ n ≤ 10^5), 
• Dòng thứ i trong n dòng tiếp theo chứa số nguyên ai (|ai| ≤ 10^9). 
Kết quả: Đưa ra file văn bản SEQUENCE.OUT một số nguyên – giá trị lớn nhất của 
hàm f (i,j,k)tìm được. 
Ví dụ: 
SEQUENCE.INP 
5 
Ngoâ Ñaêng Hieàn – Hoïc Vieän Haûi Quaân 2011 
38 
-1 
2 
-2 
-3 
5 
SEQUENCE.OUT 
18 
// Code của @Sounj 
// Dùng : Quy Hoạch Động 
#include 
#include 
#define MAX 100000 
using namespace std; 
int max_f(int a[], int N) 
{ 
 if(N<3) return 0; 
 int f[MAX]; 
 int luu, tg; 
 int i; 
 // vòng lặp đầu tiên: f = ai 
 f[0] = a[0]; 
 for(i=1; i<N; i++) 
 if(f[i-1]<a[i]) f[i]=a[i]; else f[i] = f[i-1]; 
 // vòng lặp thứ 2: f = ai + 2* a[j] 
 luu = f[1]; f[1] = f[0] + a[1]*2; 
 for(i=2; i<N; i++) 
 { 
 tg = f[i]; 
 if(f[i-1]<luu+a[i]*2) f[i] = luu+a[i]*2; else f[i] = f[i-1]; 
 luu = tg; 
 } 
 // vòng lặp thứ 3: f = ai + 2* a[j] + 3*a[k] 
 luu = f[2]; f[2] = f[1] + a[2]*3; 
 for(i=3; i<N; i++) 
 { 
 tg = f[i]; 
 if(f[i-1]<luu+a[i]*3) f[i] = luu+a[i]*3; else f[i] = f[i-1]; 
 luu = tg; 
 } 
 return f[N-1]; 
} 
void main() 
{ 
 int a[] = {-1, 2, -2, -3, 5}; 
 int N = 5; 
 cout<<"Ket qua: "<< max_f(a, N); 
Ngoâ Ñaêng Hieàn – Hoïc Vieän Haûi Quaân 2011 
39 
 getch(); 
} 
// Code của @hunterphu 
// Dùng : Quy Hoạch Động 
#include 
#define k -1000000000 
using namespace std; 
long long a[100001]; 
int n; 
long long x=k,y=k,z=k; 
int main() 
{ 
 scanf ("%d",&n); 
 for (int i=1;i<=n;i++) 
 { 
 scanf ("%I64d",&a[i]); 
 x=max(x,y+3*a[i]); 
 y=max(y,z+2*a[i]); 
 z=max(z,a[i]); 
 } 
 printf ("%I64d",x); 
 system("pause"); 
 return 0; 
} 
Bài :Kết bạn (Ko chuyên 2009) 
 Theo quan niệm của người Á Đông cổ, mỗi cá nhân khi sinh ra đều ứng với một ngôi sao, 
được gọi là sao chiếu mệnh. Các hoạt động của cá nhân đều bị chi phối bởi ngôi sao này, kể cả 
quá trình kết bạn – hẹn hò. Theo thuyết Âm dương – Ngũ hành, hai người chỉ có thể tạo lập mối 
quan hệ bền vững khi các sao chiếu mệnh của họ không có các thuộc tính tương khắc. Qua hàng 
nghìn năm quan sát và chiêm nghiệm, các chiêm tinh gia đã ghi nhận được n sao và hầu hết các 
tính chất tương sinh – tương khắc giữa chúng. Để có thể nhanh chóng đáp ứng nhu cầu kiểm tra 
độ tương hợp của các sao, hiệp hội ABS (Association of Broker for Single) tạo lập cơ sở dữ liệu 
ghi nhận tính chất của tất cả các sao đã khảo sát được. Trong cơ sở dữ liệu này, các sao được 
đánh số từ 1 tới n; sao thứ i có một giá trị si thể hiện khả năng thích nghi của sao gọi là độ thích 
nghi. Hai sao khác nhau có thể có cùng độ thích nghi. Thông qua độ thích nghi của các sao, 
người ta xác định khả năng tương hợp của chúng. Khả năng tương hợp của 2 sao được tính bằng 
tổng 2 độ thích nghi của chúng. 
Bài toán: Cho số nguyên dương n, dãy s1, s2, , sn là độ thích nghi của các sao và số nguyên 
B. Hãy xác định số lượng các cặp sao (i, j) mà si + sj = B, với 1 ≤ i < j ≤ n. 
Ví dụ: trong 5 sao với độ thích nghi 3, 5, 6, 5, 3 có 4 cặp có khả năng tương hợp bằng 8. 
Dữ liệu: Vào từ file văn bản FRIEND.INP: 
• Dòng đầu tiên ghi 2 số nguyên n, B (2 ≤ n ≤ 10^5, |B| ≤ 10^9), 
• Mỗi dòng trong n dòng tiếp theo ghi một số nguyên là độ thích nghi của một 
sao, độ thích nghi có trị tuyệt đối bé hơn 2^15 
Ngoâ Ñaêng Hieàn – Hoïc Vieän Haûi Quaân 2011 
40 
. 
Hai số trên cùng dòng cách nhau ít nhất một dấu cách. 
Kết quả: Đưa ra file văn bản FRIEND.OUT một số nguyên – số lượng cặp sao có 
độ tương hợp B tìm được. 
Ví dụ 
FRIEND.INP 
5 8 
3 
5 
6 
5 
3 
FRIEND.OUT 
4 
// Code của @hienclubvn 
#include 
#include 
#define IN "FRIEND.INP" 
#define OUT "FRIEND.OUT" 
long *A; 
int n,B,count=0; 
void Read() 
{ 
 FILE *fin; 
 fin=fopen(IN,"r"); 
 fscanf(fin,"%d %d",&n,&B); 
 // Cap Phat bo nho dong 
 A=(long*)malloc(n*sizeof(long)); 
 int i; 
 for(i=0;i<n;i++) 
 fscanf(fin,"%d",&A[i]); 
 fclose(fin); 
} 
void Write() 
{ 
 FILE *fout; 
 fout=fopen(OUT,"w"); 
 fprintf(fout,"%d\n",count); 
 fclose(fout); 
} 
void Process() 
{ 
 int i,j; 
 for(i=0;i<n-1;i++) 
 for(j=i+1;j<n;j++) 
 if(A[i]+A[j]==B) count++; 
} 
int main() 
{ 
 Read(); 
 Process(); 
Ngoâ Ñaêng Hieàn – Hoïc Vieän Haûi Quaân 2011 
41 
 Write(); 
 return 0; 
} 
// Code của @Vibzz90 
#include 
#include 
using namespace std; 
const char in[]="bai1in.txt"; 
const char out[]="bai1out.txt"; 
int *a; 
long n,B; 
int sosanh(void const *a1, void const *a2) 
{ 
 return (*(int*)a1-*(int*)a2); 
} 
int process() 
{ 
 int dem=0; 
 long buf; 
 qsort(a,n,sizeof(int),sosanh); 
 for(int i=0;i<n;i++){ 
 for(int j=i+1;j<n;j++) 
 { 
 buf=a[i]+a[j]; 
 if(buf==B) dem++; 
 if(buf>B) break; 
 } 
 } 
 return dem; 
} 
void input() 
{ 
 ifstream f(in); 
 f>>n>>B; 
 a=new int[n]; 
 for(int i=0;i>a[i]; 
 f.close(); 
} 
void gentest() 
{ 
 cout<<"Nhap n,B: "; 
 cin>>n>>B; 
 ofstream f(in); 
 f<<n<<" "<<B<<endl; 
 srand(time(NULL)); 
 for(int i=0;i<n;i++) 
 f<<(rand()+rand()-32768)<<endl; 
 f.close(); 
} 
int main() 
{ 
 cout<<"gentest?"; 
Ngoâ Ñaêng Hieàn – Hoïc Vieän Haûi Quaân 2011 
42 
 int choice;cin>>choice; 
 if(choice) gentest(); 
 input(); 
 cout<<process()<<endl; 
 system("pause"); 
 return 0; 
} 
Bài: Hiệu chỉnh ảnh đơn sắc (Ko chuyên 2009) 
Ảnh đơn sắc là ảnh chỉ gồm một màu nhưng các vùng trên ảnh khác nhau về mức sáng 
– ví dụ ảnh xám (grayscale image). Để biểu diễn một ảnh đơn sắc hình chữ nhật trên máy tính, 
người ta thường dùng một ma trận P, giá trị tại dòng i cột j của P chính là mức sáng của điểm 
ảnh tại vị trí tương ứng trên ảnh. 
Việc chụp và đưa ảnh vào máy tính thỉnh thoảng có sai sót tạo nên nhiễu. Nhiễu là các điểm ảnh 
có độ sáng khác hẳn vùng ảnh xung quanh. Có nhiều cách làm giảm sự khác biệt này. Một trong 
những cách đó là dùng một cửa sổ hình vuông 3x3 có cạnh song song với cạnh của ảnh và hiệu 
chỉnh các điểm ảnh trong vùng ảnh bị nhiễu. Mỗi điểm ảnh ở dòng i cột j sẽ được thay thế bằng 
trung vị của các giá trị ảnh đang có trong cửa sổ có tâm tại vị trí (i, j) ở ảnh gốc ban đầu. Trong 
các trường hợp điểm ảnh ở biên, chỉ xét trung vị của các giá trị nằm trong ảnh. 
Nhắc lại rằng, trung vị của k số a1, a2,  ak là số ở vị trí t khi sắp xếp k số này theo trật tự tăng 
dần, trong đó t là phần nguyên của số (k+1)/2 
Dưới đây là ví dụ mô tả việc hiệu chỉnh ảnh bằng cách nêu trên. 
Bài toán: Cho ma trận số nguyên P cấp m× n biểu diễn một vùng ảnh đơn sắc có nhiễu. 
Hãy dùng cách đã nêu ở trên để hiệu chỉnh các điểm ảnh trong vùng ảnh bị nhiễu. 
Dữ liệu: Vào từ file văn bản ADJUST.INP gồm: 
• Dòng đầu tiên chứa 2 số nguyên m, n (1 ≤m, n ≤ 100), 
• m dòng tiếp theo mỗi dòng ghi n số nguyên không âm là mức sáng các điểm 
ảnh. Giá trị mức sáng không vượt quá 255. 
Kết quả: Đưa ra file văn bản ADJUST.OUT gồm m dòng, mỗi dòng gồm n số là các 
mức sáng trong vùng ảnh sau khi đã hiệu chỉnh. 
Hai số trên cùng dòng cách nhau ít nhất một dấu cách. 
Ví dụ: 
ADJUST.INP 
4 5 
10 11 12 13 14 
Ngoâ Ñaêng Hieàn – Hoïc Vieän Haûi Quaân 2011 
43 
15 0 16 17 11 
4 5 6 7 8 
2 10 6 7 5 
ADJUST.OUT 
10 11 12 13 13 
5 10 11 12 11 
4 6 7 7 7 
4 5 6 6 7 
// Code của @hienclubvn 
#include 
#include 
#define IN "ADJUST.INP" 
#define OUT "ADJUST.OUT" 
int **A,**T,m,n; 
void Input() 
{ 
 FILE *fin; 
 fin=fopen(IN,"r"); 
 int i,j; 
 fscanf(fin,"%d %d",&m,&n); 
 // Cap phat dong 
 A=(int**)malloc(m*sizeof(int)); 
 for(i=0;i<m;i++) A[i]=(int*)malloc(n*sizeof(int)); 
 T=(int**)malloc(m*sizeof(int)); 
 for(i=0;i<m;i++) T[i]=(int*)malloc(n*sizeof(int)); 
 // read File 
 for(i=0;i<m;i++) 
 for(j=0;j<n;j++) fscanf(fin,"%d",&A[i][j]); 
 fclose(fin); 
} 
void Sort(int *B,int n) 
{ 
 int i,j; 
 for(i=0;i<n-1;i++) 
 for(j=i+1;j<n;j++) 
 if(B[i]>B[j]) 
 { 
 int temp=B[i]; 
 B[i]=B[j]; 
 B[j]=temp; 
 } 
} 
int FindPoint(int i,int j) 
{ 
 int B[10]; 
 int k,l,m1,n1,t=0; 
 int di[3]={-1,0,1}; 
 int dj[3]={-1,0,1}; 
 for(k=0;k<3;k++) 
 { 
 m1=i+di[k]; 
Ngoâ Ñaêng Hieàn – Hoïc Vieän Haûi Quaân 2011 
44 
 for(l=0;l<3;l++) 
 { 
 n1=j+dj[l]; 
 if(m1>=0&&m1=0&&n1<n) 
 B[t++]=A[m1][n1]; 
 } 
 } 
 Sort(B,t); 
 int p=(t+1)/2-1; 
 int x=B[p]; 
 return x; 
} 
void Process() 
{ 
 int i,j; 
 for(i=0;i<m;i++) 
 for(j=0;j<n;j++) 
 { 
 T[i][j]=FindPoint(i,j); 
 } 
} 
void Output() 
{ 
 FILE *fout; 
 fout=fopen(OUT,"w"); 
 int i,j; 
 for(i=0;i<m;i++) 
 { 
 for(j=0;j<n;j++) 
 if (j!=n-1)fprintf(fout,"%d ",T[i][j]); 
 else fprintf(fout,"%d\n",T[i][j]); 
 } 
 fclose(fout); 
} 
int main() 
{ 
 Input(); 
 Process(); 
 Output(); 
 free(A); 
 free(T); 
 return 0; 
} 

File đính kèm:

  • pdftuyen_tap_1_so_de_thi_va_code_cac_ky_thi_olp_tin_hoc_sinh_vi.pdf
Tài liệu liên quan