Viết chương trình đọc vào hai số thực dương a và b và tính tổng tất cả các số nguyên
không nhỏ hơn a và không lớn hơn b.
Dữ liệu: Vào từ file văn bản SUM.INP gồm một dòng chứa hai số thực dương a, b.
Kết quả: Đưa ra file văn bản SUM.OUT gồm một dòng chứa một số nguyên là tổng tất cả
các số nguyên không nhỏ hơn a và không lớn hơn b.
Ví dụ:
SUM.INP SUM.OUT
0.3 2.89
SUM.OUT
3
Chú ý:
- Có 50% số test có 0 < a ≤ b ≤ 1000;
- Có 50% số test còn lại có 0 < a ≤ b ≤ 109
#include<stdio.h>
#include<stdlib.h>
void main()
{
float a,b;
long i,t=0;
FILE *in,*out;
in=fopen("SUM.INP ","r");
out=fopen("SUM.OUT ","w");
if(in==NULL || out==NULL)
{
printf("error");exit(0);
}
fscanf(in,"%f%f",&a,&b);
fprintf(in,"%f %f",a,b);
for(i=long(a);i<=long(b);i++)
if(i>=a && i<=b) t+=i;
fprintf(out,"%ld",t);
fcloseall();
}
Bài 2. Dãy số (30 điểm)
Cho dãy số gồm n số nguyên a1, a2, . . . , an. Một đoạn con của dãy đã cho là dãy ai
(1 ≤ i ≤ j ≤ n), dãy có độ dài (j − i + 1) và có trọng số bằng tổng (ai+. . . +aj).
Yêu cầu: Tìm đoạn con có độ dài là một số chia hết cho 3 và có trọng số lớn nhất.
Dữ liệu: Vào từ file văn bản SEQ.INP có định dạng như sau:
Dòng đầu ghi số nguyên n (n ≥ 3);
Dòng thứ hai ghi n số nguyên a1, a2, . . . , an (|ai
Kết quả: Ghi ra file văn bản SEQ.OUT giá trị trọng số của đoạn con tìm được.
OLP’14 - Đề thi khối Cá nhân Cao đẳng Trang 1/2
Ví dụ:
SEQ.INP
11
SEQ.OUT
1 1 1 -9 1 1 1 1 -1 1 -9
Chú ý:
- Có 30% số test có n ≤ 300;
- Có 30% số test khác có n ≤ 3000;
- Có 40% số test còn lại có n ≤ 300000.
#include<stdio.h>
#include<stdlib.h>
void main()
{
FILE *in,*out;
in=fopen("SEQ.INP","r");
out=fopen("SEQ.OUT","w");
if(in==NULL || out==NULL)
{
printf("error");exit(0);
}
int n,i=0,j,k;
long a[100],max=-99999999,t;
fscanf(in,"%d",&n);
while(fscanf(in,"%ld",&a[i])!=EOF) i++;
for(i=0;i<n;i++)
for(j=i;j<n;j++)
if((j-i+1)%3==0)
{
t=0;
for(k=i;k<=j;k++) t+=a[k];
if(max<t)max=t;
}
fprintf(out,"%ld",max);
fcloseall();
}
Bài 3. Giao đấu hữu nghị (40 điểm)
Để tạo không khí vui vẻ náo nhiệt, trong buổi giao lưu giữa sinh viên các trường tham dự
OLP – ACM, trường đăng cai OLP năm tới đề xuất tổ chức một cuộc thi đấu game online
tay đôi giữa sinh viên trường mình với sinh viên trường sở tại. Mỗi trường cử ra một đội n
người, tạo thành n cặp đấu, sinh viên cùng trường không đấu với nhau. Trò chơi được chọn
là một trò chơi rất phổ biến, được các bạn trẻ yêu thích, ai cũng biết và đã từng chơi nhiều
trước đó. Mọi người đều biết chỉ số năng lực của mình trong trò chơi này và biết rằng nếu
đấu tay đôi, ai có năng lực cao hơn sẽ thắng. Trong các trận đấu tay đôi, người thắng sẽ
được 1 điểm, người thua – 0 điểm. Thời gian chơi được quy định đủ để phân biệt thắng
thua. Các trận hòa sẽ kéo dài vô hạn và sẽ bị hủy kết quả khi hết thời gian.Với tinh thần
fair play các bạn trường đề xuất ngồi vào vị trí thi đấu, truy nhập vào hệ thống và gửi về
máy chủ chỉ số năng lực của mình. Trưởng đoàn của trường sở tại có 1 giây để xử lý thông
tin, phân công ai đấu với ai để tổng số điểm thu được là lớn nhất.
Yêu cầu: Hãy xác định, với cách bố trí tối ưu các cặp đấu, đội của trường sở tại sẽ có bao
nhiêu điểm.
Dữ liệu: Vào từ file văn bản FAIRPLAY.INP:
Dòng đầu tiên chứa số nguyên n (1 ≤ n ≤ 105
Dòng thứ 2 chứa n số nguyên a1, a2, . . . , an, trong đó ai – chỉ số năng lực của
người thứ i thuộc đội của trường đề xuất, 1 ≤ ai ≤ 109
Dòng thứ 3 chứa n số nguyên b1, b2, . . . , bn, trong đó bi – chỉ số năng lực của người
thứ i thuộc đội của trường sở tại, 1 ≤ bi ≤ 109
Kết quả: Đưa ra file văn bản FAIRPLAY.OUT một số nguyên – số điểm đội trường sở tại
có thể đạt được với cách bố trí cặp chơi tối ưu.
Ví dụ:
FAIRPLAY.INP
5
10 15 30 20 25
28 24 20 16 14
FAIRPLAY.OUT
4
Chú ý:
- Có 25% số test có n ≤ 3;
- Có 25% số test khác có n ≤ 8;
- Có 25% số test khác có n ≤ 1000;
- Có 25% số test còn lại có n ≤ 105
#include<iostream>
using namespace std;
#include<stdlib.h>
void doi(long &a,long &b)
{
long t=a;a=b;b=t;
}
void xep(long *a,int n)
{
for(int i=0;i<n-1;i++)
{
int m=i;
for(int j=i+1;j<n;j++)
if(a[m]>a[j])m=j;
doi(a[m],a[i]);
}
}
int maxdiem(FILE *t)
{
long a[100],b[100];
int n,i=0,j=0,max=0;
fscanf(t,"%d",&n);
while(i<n){ fscanf(t,"%ld",&a[i]);i++;}
i=0;
while(fscanf(t,"%ld",&b[i])!=EOF) i++;
xep(a,n);xep(b,n);
for(i=0;i<n;i++)
{
if(j==n) break;
while(j<n) if(b[j]>a[i]) {max++;break;} else j++;
}
return max;
}
void main()
{
int i,n;
long a;
FILE *in=fopen("FAIRPLAY.INP","r");
FILE *out=fopen("FAIRPLAY.OUT","w");
if(in==NULL || out==NULL)
{
cout<<"error";exit(0);
}
fprintf(out,"%d",maxdiem(in));
fclose(in);fclose(out);
}