|
Задачи
1) На станцию города прибывает за сутки N поездов.
Известно время прибытия и отправки поездов. Так же известно, что на текущий
путь следующий поезд может пребывать только через 5 минут после убытия
предыдущего. Требуется написать программу, определяющую минимальное количество
путей, необходимых для принятия всех поездов по текущему расписанию.
Время задано только в часах и минутах. Время стоянки поезда от 1минуты до 12ч.
Чтобы программа прошла все тесты сложность алгоритма не должна превышать N.
INPUT.TXT
12 00 13 40
16 17 19 30
19 05 19 08
OUTPUT.TXT
2
2) Имеется N гирек массой 1г, 2г, 3г, ... Nг. N<=1000 Требуется вывести
максимально возможное число пар, таких что их сумма - это простое число.
INPUT.TXT
7
OUTPUT.TXT
1 4
2 5
6 7
3) Проверить домашнюю работу Васи Пупкина по математике, в файле задано выражение
из двух целых чисел(integer) и знаков +,-,*,/ = . Нужно проверить правильность записи и вывести
соответственно ВЕРНО, НЕВЕРНО, ВЫРАЖЕНИЕ НЕ КОРРЕКТНО. Некорректной записью
является любая, где идут два нецифровых символа подряд, либо нарушена
очередность данных: число, операция, число, равно, число.
INPUT.TXT
2+3=5
OUTPUT.TXT
верно
4) Вычислить значение арифметического выражение с точностью 5 знаков
(вывести в файл):
1
-----
1 + 1
-------
3 + 1
------
5 + 1
--------
... + 1
-------
101 + 1
-----
103
OUTPUT.TXT
0.76159
5) Найти наибольший общий делитель двух чисел, помещающихся в longint,
INPUT.TXT
16 24
OUTPUT.TXT
8
Решения
Borland Pascal 7.0 | Borland C++ 3.1
|
---|
{Задача N1}
var i,h1,m1,h2,m2,t1,t2,t,max:longint;
m:array[0..1500] of longint;
f:text;
begin
assign(f,'INPUT.TXT');
reset(f);
for i:=0 to 1439 do m[i]:=0;
while not eof(f) do begin
readln(f,h1,m1,h2,m2);
t1:=60*h1+m1;
t2:=60*h2+m2+5;
if t2<t1 then t2:=1440+t2;
inc(m[t1]);
if t2>1439 then inc(m[0]);
dec(m[t2 mod 1440]);
end;
close(f);
t:=0;max:=0;
for i:=0 to 1439 do begin
t:=t+m[i];
if t>max then max:=t;
end;
assign(f,'OUTPUT.TXT');
rewrite(f);
write(f,max);
close(f);
end.
|
//Задача N1
#include <stdio.h>
long i,h1,m1,h2,m2,t1,t2,t,max,m[1500];
void main(){
for(i=0;i<1440;i++) m[i]=0;
FILE *f=fopen("INPUT.TXT","r");
while(!feof(f)){
if(fscanf(f,"%ld%ld%ld%ld",&h1,&m1,&h2,&m2)<4) break;
t1=60*h1+m1;
t2=60*h2+m2+5;
if(t2<t1) t2+=1440;
m[t1]++;
if(t2>1439) m[0]++;
m[t2%1440]--;
}
fclose(f);
t=max=0;
for(i=0;i<1440;i++)
if((t+=m[i])>max) max=t;
f=fopen("OUTPUT.TXT","w");
fprintf(f,"%ld",max);
fclose(f);
}
|
{Задача N2}
var i,j,p,k,n:integer;
m:array[0..500,0..1] of integer;
Ok:boolean;
f:text;
function IsPrime(x:integer):boolean;
var i:integer;
begin
for i:=2 to x div 2 do
if x mod i =0 then begin
IsPrime:=false;
exit;
end;
IsPrime:=true;
end;
begin
assign(f,'INPUT.TXT');
reset(f);
read(f,n);
close(f);
k:=0;
for i:=1 to n-1 do
for j:=n downto i+1 do begin
Ok:=true;
for p:=0 to k-1 do
if (m[p][0]=i) or (m[p][1]=i) or
(m[p][0]=j) or (m[p][1]=j) then Ok:=false;
if Ok then
if IsPrime(i+j) then begin
m[k][0]:=i; m[k][1]:=j; inc(k);
break;
end;
end;
assign(f,'OUTPUT.TXT');
rewrite(f);
for i:=0 to k-1 do writeln(f,m[i][0],' ',m[i][1]);
close(f);
end.
|
//Задача N2
#include <stdio.h>
int i,j,p,k,n,ok,m[500][2];
int IsPrime(int x){
for(int i=2; i<=x/2; i++)
if(x%i==0) return 0;
return 1;
}
void main(){
FILE *f=fopen("INPUT.TXT","r");
fscanf(f,"%d",&n);
fclose(f);
k=0;
for(i=1;i<n;i++)
for(j=n;j>i;j--){
ok=1;
for(p=0;p<k;p++)
if((m[p][0]==i)||(m[p][1]==i)||
(m[p][0]==j)||(m[p][1]==j)) ok=0;
if(ok)
if(IsPrime(i+j)){
m[k][0]=i; m[k][1]=j; k++;
break;
}
}
f=fopen("OUTPUT.TXT","w");
for(i=0;i<k;i++) fprintf(f,"%d %d\n",m[i][0],m[i][1]);
fclose(f);
}
|
{Задача N3}
var f:text;
s:string;
l,r,k,x,x1,x2:integer;
procedure Message(msg:string);
begin
assign(f,'output.txt');
rewrite(f);
write(f, msg);
close(f);
halt;
end;
function StrToInt(str:string; var x:integer):boolean;
var err:integer;
begin
val(str,x,err);
StrToInt:=err=0;
end;
begin
assign(f,'input.txt');
reset(f);
readln(f,s);
close(f);
for k:=1 to length(s)-1 do
if not StrToInt(s[k],x) and not StrToInt(s[k+1],x)
then Message('выражение не корректно');
k:=Pos('=',s);
if (k=0) or not StrToInt(copy(s,k+1,length(s)-k),r)
then Message('выражение не корректно');
dec(k); s:=copy(s,1,k);
while (k>0) and StrToInt(s[k],x) do dec(k);
if k=0 then Message('выражение не корректно');
if not StrToInt(copy(s,1,k-1),x1) or
not StrToInt(copy(s,k+1,length(s)-k),x2)
then Message('выражение не корректно');
if x2=0 then Message('неверно');
case s[k] of
'+': l:=x1+x2;
'-': l:=x1-x2;
'*': l:=x1*x2;
'/': begin
if x1 mod x2>0 then Message('неверно');
l:=x1 div x2;
end;
end;
if l=r then Message('верно') else Message('неверно');
end.
|
//Задача N3
#include <stdio.h>
#include <stdlib.h>
long a,b,c,n;
char ch;
void Message(char *msg){
FILE *f=fopen("OUTPUT.TXT","w");
fprintf(f,"%s",msg);
fclose(f);
exit(0);
}
void main(){
FILE *f=fopen("INPUT.TXT","r");
n=fscanf(f,"%ld%c%ld=%ld",&a,&ch,&b,&c);
fclose(f);
if(n<4) Message("выражение не корректно");
switch(ch){
case '+': n=a+b; break;
case '-': n=a-b; break;
case '*': n=a*b; break;
case '/': if(!b) Message("неверно");
if(a%b) Message("неверно");
n=a/b; break;
default : Message("выражение не корректно");
}
if(n==c) Message("верно"); else Message("неверно");
}
|
{Задача N4}
var i:integer;
s:real;
f:text;
begin
s:=103;
for i:=51 downto 1 do s:=2*i-1+1/s;
assign(f,'OUTPUT.TXT');
rewrite(f);
write(f,1/s:0:5);
close(f);
end.
|
//Задача N4
#include <stdio.h>
float s=103;
void main(){
for(int i=101;i>0;i-=2) s=i+1/s;
FILE *f=fopen("OUTPUT.TXT","w");
fprintf(f,"%f",1/s);
fclose(f);
}
|
{Задача N5}
var m,n:longint;
f:text;
begin
assign(f,'INPUT.TXT');
reset(f);
read(f,m,n);
close(f);
while (m>0) and (n>0) do
if m<n then n:=n mod m
else m:=m mod n;
assign(f,'OUTPUT.TXT');
rewrite(f);
write(f,m+n);
close(f);
end.
//Задача N5
#include <stdio.h>
long m,n;
void main(){
FILE *f=fopen("INPUT.TXT","r");
fscanf(f,"%ld%ld",&m,&n);
fclose(f);
while(m*n) m<n?n%=m:m%=n;
f=fopen("OUTPUT.TXT","w");
fprintf(f,"%ld",m+n);
fclose(f);
}
| |
Решения задач предоставлены Беляевым С.Н.
Автор не гарантирует 100%-ю правильность решений
Скачать файлы с решениями вы можете здесь: olimp2003.rar (23Kб)
| |