Сайт підготовки до олімпіади з інформатики

програмування в С++

Школа олімпійського резерву з інформатики
Системи числення 23_09_2011 PDF Печать E-mail
Добавил(а) Administrator   
14.10.11 11:47

Переведення чисел з однієї системи числення в іншу

Десяткова

Двійкова

Відмітка про виконання

0

0

 

2

10

 

5

101

 

10

1010

 

32

100000

 

98

1100010

 

1024

1000000000

 

6783

1101001111111

 

98321

11000000000010001

 

2000000

111101000010010000000

 

1073741824

1000000000000000000000000000000

 

5000000000

100101010000001011111001000000000

 

 

Переведення чисел в різних системах числення

На приклад, якщо потрібно перемножити числа 101 і 1001 в двійковій системі, то він спочатку ці числа переводить в десяткову систему таким чином :

(101)2=1*22+0*21+1*20=4+0+1=5

(1001)2=1*23+0*22+0*21+1*20=8+0+0+1=9

Після чого множення чисел 5 і 9 Вася з легкістю виконує в десятковій системі числення і отримує число 45. Далі виконує переведення з десяткової системи числення в двійкову. Для цього потрібно ділити число 45 на 2 ( порядок системи числення ), запам'ятовує залишки від ділення, до тих пір поки в результаті не залишиться число 0:

Відповідь складається з одержаних залишків від ділення шляхом їх запису в зворотному  порядку . Таким чином одержуємо результат : (101)2 * (1001)2 = (101101)2.

 

1. Задача. Перевести число з  будь-якої системи числення в будь-яку іншу.

Протестувати самостійно

2. Задача  BINARY

Ім'я вхідного файлу:   BINARY.DAT

Ім'я вихідного файлу: BINARY.SOL

Максимальний час роботи на одному тесті: 3с

Талановитий учень Діма придумав цікаву гру з числами. А саме, взявши довільне ціле число, він переводить його в двійкову систему числення, отримуючи деяку послідовність з нулів та одиниць, що починається з одиниці. (Наприклад, десяткове число 1910 = 1×24+0×23+0×22+1×21+1×20 в двійковій  системі запишеться як 100112). Потім вчитель починає зсовувати цифри отриманого двійкового числа по циклу (так, що остання цифра стає першою, а всі інші зсовуються на одну позицію вправо), виписуючи утворюються при цьому послідовності з нулів і одиниць у стовпчик - він помітив, що незалежно від вибору вихідного числа виходять послідовності починають з деякого моменту повторюватися. І, нарешті, учень відшукує максимальне з виписаних чисел і переводить його назад в десяткову систему числення, вважаючи це число результатом виконаних маніпуляцій. Так, для числа 19 список послідовностей буде таким:

10011

11001

11100

01110

00111

10011

...

і результатом гри буде число 1×24+1×23+1×22+0×21+0×20 = 28.

Оскільки придумана гра з числами все більше займає уяву учня, відволікаючи тим самим його від навчання і підготовки до олімпіади, Вас просять написати програму, яка б допомогла Дімі отримувати результат гри без важких ручних обчислень.

 

Вхідний файл містить одне ціле число N (0£N£32767).

Ваша програма повинна вивести в вихідний файл рядок, що містить одне ціле число, рівне результату гри.

Приклад

BINARY.DAT

BINARY.SOL

19

28

3. Задача  Нулі

Ім'я вхідного файлу:   ZEROS.DAT

Ім'я вихідного файлу: ZEROS.SOL

Максимальний час роботи на одному тесті: 5с

Необхідно написати програму для знаходження кількості N-значних чисел в системі числення за основою K, таких що їхній запис не буде містити двох нулів підряд.

Формат вхідних даних.

Єдиний рядок вхідного файлу ZEROS.DAT містить два натуральних числа N та K, 2 <= K <= 10, N + K <= 18.

Формат вихідних даних.

Єдиний рядок вихідного файлу ZEROS.SOL повинен містити одне натуральне число - розв'язок задачі.

Приклад.

ZEROS.DAT:

4 2

ZEROS.SOL:

5

 

4. Задача. Міжнародна конференція

Вас найняли для того, щоб визначити місця дипломатів за столом обговорень міжнародної конференції. На конференцію запрошено по одному дипломату з N різних країн світу. Ко­жен дипломат знає від однієї до п'яти мов. Дип­ломати, які не знають спільної мови, не можуть розмовляти один з одним. До того ж, деякі краї­ни проголосили, що не будуть підтримувати дипломатичних стосунків з деякими іншими, тобто представники цих країн не будуть роз­мовляти один з одним. Ваше завдання полягає в розробці програми DIPLOMAT.pas/.c/.cpp, що визначає місця за столом для дипломатів таким чином, щоб кожен мав можливість розмовляти з обо­ма своїми сусідами, які сидять ліворуч та пра­воруч від нього.

Стіл, що використовується, - круглий і розрахований на N персон (N£20). Дипломат може спілкуватися з дипломатом, який сидить ліво­руч, однією мовою, а з дипломатом, що сидить праворуч, - іншою.

Технічні вимоги:

Вхідний файл: DIPLOMAT. DAT.

Вихідний файл: DIPLOMAT. SOL.

Програма: diplomat.pas/.c/.cpp

Формат вхідних даних. У першому рядку текстового файла DIPLOMAT. DAT - число N. Далі - N рядків, по одному рядку на диплома­та. Кожен рядок - послідовність слів. Сусідні слова відокремлені пробілом. Кожне слово - це послідовність великих латинських літер. Перше слово - код країни - складається з трьох літер. Друге слово має довжину від 1 до 5 літер і являє собою перелік мов, якими може спілкуватися дипломат. Кожна мова позначена однією літерою. Далі - список з не більш ніж N трилітерних слів - кодів країн, з якими уряд дипломата підтримує дипломатичні стосунки.

Формат вихідних даних. До файла DIPLOMAT. SOL треба вивести список дипломатів у порядку розміщення за столом (по одному дипломату в рядку). Кожен рядок складається з трьох слів: перше - код мови, якою дипломат може спілкуватися з сусідом ліворуч, друге - код країни дипломата, третє - код мови для спілкування з сусідом праворуч. Мож­ливе існування кількох розв'язків. Вам по­трібно знайти один. Якщо розв'язку не існує, то ваша програма має видати таке повідомлен­ня: «NO  SOLUTION EXIST»

Приклад:

DIPLOMAT. DAT

DIPLOMAT. SOL

4

USA EC UCR CHN

CHN GC USA GBR

GBR EG UCR CHN

UCR E USA GBR

C USA E

E UCR E

E GBR G

G CHN C

2

USA ER CHN

CHN CP USA

NO SOLUTION EXIST

 

 

Домашні задачі

 

1. Прості числа (решето Ератосфена).

2. Супер прості числа.

 
05_12_2012 Мови прорамування С++ та Пскаль PDF Печать E-mail
Добавил(а) Гісь Ігор Володимирович   
05.12.12 09:53

1. Порядок роботи

Visual C++

Delphi

Порядок роботи

1. Запустити середовище Головне меню\Програми\Visual C++ 9.0 Express Edition\Microsoft Visual C++ 2008 Express Edition.

2. Створити новий проект «Консольний додаток Win32», який зберігати в власну папку.

3. Перевірити програми з додатку.

Зауваження

Для компіляції та виконання натискуйте клавішу Ctrl F5

// Під'єднання модулів

#include "stdafx.h" //генерація файлу предкомпільованих заголовків

#include <iostream>//організація введення-виведення в мові програмування C++

#include <math.h>//виконання простих математичних операцій

using namespace std;// звернення до об'єктів напряму

void _tmain()

{

Int a,b; //опис цілих

Float c; //опис дійсних

cin>>a>>b;//ведення даних

c=a/b;

cout<<c<<”\n”;//виведнння даних

}

1. Запустити середовище

2. Створити новий проект New-Other-Consol Aplication, який зберігати в власну папку.

3. Перевірити програми з додатку.

Зауваження

Для компіляції та виконання натискуйте клавішу F9

program Project2;

{$APPTYPE CONSOLE}

Var a,b,c:integer;

begin

readln(a,b);

c:=a+b;

writeln(c);

readln;

end.

2. Структура слідування

С++

Pascal

Типи

Тип даних:

Розмір в байтах:

Числовий діапазон:

Char

1

один символ

Short

2

от -2^8 до 2^8

Int

4

от -2^16 до 2^16

Float

4

от -2^16 до 2^16

Long

4

от -2^16 до 2^16

Double

8

от -2^32 до 2^32

Long Double

8

от -2^32 до 2^32

Unsigned Short

2

от 0 до 2^16

Unsigned Int

4

от 0 до 2^32

Unsigned Float

4

от 0 до 2^32

Unsigned Double

8

от 0 до 2^64

unsigned char 1 від 0 до 255
wchar_t 2 от 0 від 65535
short 2 від -32768 дo +32767
unsigned short 2 відд 0 до 65535
int 4 від -2147483648 до 2147483647
unsigned int 4 відт 0 до 4294967295
long 4 від -2147483648 до 2147483647
unsigned long 4 відт 0 до 4294967295
float 4 ± 3,4x10±38, 7-знаків
double 8 ± 1,7x10*308, 15 знаків

long double 8 ± 1,7x10*308, 15 знаків

#include "stdafx.h"

#include <iostream>

using namespace std;

int main( void )

{ cout << " (unsigned)int = " << sizeof(int) << endl;

cout << " (unsigned)short = " << sizeof(short) << endl;

cout << " (unsigned)char = " << sizeof(char) << endl;

cout << " (unsigned)float = " << sizeof(float) << endl;

cout << " (unsigned)double = " << sizeof(double) << endl;

cout << " (unsigned)long = " << sizeof(long) << endl;

cout << " (unsigned)long double = " << sizeof(long double) << endl;

cout << " (unsigned)long long int = " << sizeof(long long int) << endl;

cout << " (unsigned)unsigned long long int = " << sizeof(unsigned long long int) << endl;

cout << " (unsigned)__int64 = " << sizeof(__int64) << endl;}

Цілочисельні

byte, shortin, integer, longint, in64

дійсні

real, double, extended

Операції

Ім'я

Опис

+

с=a+b; k=k+1; k++; s+=k;

-

c=a-b; k=k-1; k--; s-=k;

*

c=a*b;

/

a=5.0/2;//2.5 a=5/2;//2

%

a=5%2;//1

#include "stdafx.h"

#include "iostream"

using namespace std;

int _tmain()

{

int n,a,b;

cin>>n;/* 12 */

a=n/10;

b=n%10;

cout<<a<<endl;/* 1 */

cout<<b<<endl;/* 2 */

return 0;

}

Ім'я

Опис

+

с:=a+b; k:=k+1; s:=s+k;

-

c:=a-b; k=k-1;

*

c=a*b;

/

a=5/2;//2.5

div

a=5 div 2;//2

mod

a:=5 mod 2; //1

Функції

C++

Pascal

Ім'я

Опис

abs(i)

модуль числа

ceil(f)

округлення до найближчого більшого цілого числа

fabs(f)

абсолютне значення

floor(f)

округлення до найближчого меншого цілого цілого

fmod(a,b)

повертає залишок від ділення двох чисел

modf(x,p)

повертає цілу та дробову частину аргументу х зі знаком

pow(x,y)

вираховує значення xy

sqrt(f)

квадратний корінь

#include "stdafx.h"

#include "iostream"

#include "math.h"

using namespace std;

int _tmain()

{

double f;

f=-5.5; cout<<abs(f)<<endl;//5.5

f=-5.5; cout<<fabs(f)<<endl;//5.5

f=5.8; cout<<floor(f)<<endl;//5

f=5.8; cout<<ceil(f)<<endl;//6

f=9.0; cout<<sqrt(f)<<endl;//3

f=5; cout<<pow(f,2)<<endl;//25

f=5.5; cout<<fmod(f,2)<<endl;//1.5

f=17.25;double p,y;y=modf(f,&p); f=5.2; cout<<y<<" "<<p<<endl;//0.25 17

return 0;}

Ім'я

Опис

abs(i)

модуль числа

Int (x)

ціла частина дійсного числа.

Frac (x) -

дробова частина дійсного числа.

Trunc (x)

ціла частина дійсного числа, перетворена до типу LongInt.

Round (x)

округлене до цілого дійсне число, перетворене до типу LongInt.

power(x,y)

вираховує значення xy

exp(y*ln(x))

sqrt(f)

квадратний корінь

sqr(f)

квадрат числа

2. Розгалуження

С++

Pascal

Операції порівняння

<, >. <=,>=, !=, ==

<, >. <=,>=, <>, =

Логічні операції

&&, ||, !

And, or, not

Умовний оператор

if (умова) команда 1; else команда 2;

if (умова) then команда 1 else команда 2;

3. Цикл

С++

Pascal

З параметром

for (i=1;i<=n;i++) {блок операторів};

for i:=1 to n begin блок операторів end;

for i:=n downto 1 begin блок операторів end;

З перед умовою

while (умова){блок операторів};

Whileумова begin блок операторів end;

Після умовою

do {блок операторів}

while (умова);

repeat  блок операторів;until умова (хибна);

4. Масиви

С++

Pascal

Операція

Лінійний масив

Прямоктна таблиця

Опис

Int a[100];

int i, n;//індекс, кількість елементів

Int a[100][100];

int i,j, n,m;//індекс, кількість елементів

Введення

cin>>n;

for(i=1;i<=n;i++)cin>>a[i];

cin>>n>>m;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

cin>>a[i][j];

Виведення

for(i=1;i<=n;i++)cout<<a[i<<>" ";

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

cout<<a[i][j]<<" ";

Сумування

s=0;

for(i=1;i<=n;i++)s=s+a[i];

s=0;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

s=s+a[i][j];

Пошук

cin>>k;

for(i=1;i<=n;i++) if (a[i]==k) cout<<i;

cin>>k;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

if (a[i][j]==k)

cout<<i<<" "<<j;

Пошук максимального

max=a[1];nmax=1;

for(i=2;i<=n;i++)if  (a[i]>max) {max=a[i];nmax=i;}

max=a[1];imax=1;jmax=1;

for(i=1;i<=n;i++)

for(j=1;j<=m;j++)

if  (a[i][j]>max) {max=a[i][j];

imax=i;jmax=j;}

Сортування

for(i=1;i<n;i++)

for(j=1;j<n;j++)

if  (a[j]>a[j+1])

{temp=a[j];

a[j]=a[j+1];

a[j+1]=temp;}

Стирання

n=n-1;

for(i=k;i<=n;i++)

a[i]=a[i+1];

Вставка

n=n+1;

for(i=n;i>=1;i--)

a[i]=a[i-1];

Операція

Лінійний масив

Прямокутна таблиця

Опис

Var a:array[1..100] of integer;

i, n:integer;//індекс, кількість елементів

Var a:array[1..100,1..100] of integer;

i,j, n,m:integer;//індекси, кількість рядків, стовпців

Введення

readln(n);

for i:=1 to n do read(a[i]);

readln(n);

for i:=1 to n do

for j:=1 to m do

read(a[i,j]);

Виведення

for i:=1 to n do write(a[i],' ');

for i:=1 to n do begin

for j:=1 to m do

write(a[i,j],' ');

writeln;

end;

Сумування

s=0;

for i:=1 to n do s:=s+a[i];

s=0;

for i:=1 to n do

for j:=1 to m do

s:=s+a[i,j];

Пошук

readln(k);

for i:=1 to n do if  a[i]=k then writeln(i);

readln(k);

for i:=1 to n do

for j:=1 to m do

if  a[i,j]=k then

writeln(i,' ',j);

Пошук максимального

max:=a[1];nmax:=1;

for  i:=2 to n do if  a[i]>max then begin max:=a[i];nmax:=i;end;

max:=a[1];nmax:=1;mmax:=1;

for  i:=1 to n do

for j:=1 to m do

if  a[i,j]>max then begin max:=a[i,j];nmax:=i;mmax:=j; end;

Сортування

for  i:=1 to n -1do

for j:=1 to n -1do

if  a[j]>a[j+1] then begin

temp:=a[j];

a[j]:=a[j+1];

a[j+1]:=temp;

end;

Стирання

n:=n-1;

for  i:=k to n do a[i]:=a[i+1];

Вставка

n:=n+1;

for  i:=n downto k+1 do

a[i]:=a[i-1];

5. Робота з файлами

Pascal

C++

var f1,f2:text;

assign(f1,'input.dat');

reset(f1);

read(f1,...);

close(f1);

assign(f2,'output.dat');

rewite(f2);

write(f2,...);

close(f2);

#include <fstream.h>

void main()

{

ifstream inp;inp.open("input.dat");

int a,b,c;

inp>>a>>b;

inp.close();

c=a+b;

ofstream out;out.open("output.sol");

out<<c;

out.close();

}

assign(input,'input.dat');

reset(input);

read(...);

close(input);

assign(output,'output.dat');

rewite(output);

write(...);

close(output);

#include <fstream.h>

ifstream inp("input.dat");

ofstream out("output.sol");

void main()

{

int a,b,c;

inp>>a>>b;

c=a+b;

out<<c;

}

Приклад програми на Delphi

program zad1;

{$APPTYPE CONSOLE}

var a,b,c:integer;

begin

assign(input,'input.dat');

reset(input);

readln(a,b);

close(input);

c:=a+b;

assign(output,'output.ans');

rewrite(output);

writeln(c);

close(output);

end.

Приклад програми на С++

//#include "stdafx.h"

#include <cstdlib>

#include "iostream"

#include "fstream"

using namespace std;

int main()

{ifstream cin("input.dat");

ofstream cout("output.ans");

int a,b,c;

cin>>a>>b;

c=a+b;

cout<<c<<endl;

return 0;

}


 
Задачі з теми Графи PDF Печать E-mail
Добавил(а) Administrator   
15.10.14 09:06

№1. ЗАДАЧА «МІЖНАРОДНА КОНФЕРЕНЦІЯ»(100 БАЛІВ)

Вас найняли для того, щоб визначити місця дипломатів за столом обговорень міжнародної конференції. На конференцію запрошено по одному дипломату з N різних країн світу. Ко­жен дипломат знає від однієї до п'яти мов. Дип­ломати, які не знають спільної мови, не можуть розмовляти один з одним. До того ж, деякі краї­ни проголосили, що не будуть підтримувати дипломатичних стосунків з деякими іншими, тобто представники цих країн не будуть роз­мовляти один з одним. Ваше завдання полягає в розробці програми DIPLOMAT.pas/.c/.cpp, що визначає місця за столом для дипломатів таким чином, щоб кожен мав можливість розмовляти з обо­ма своїми сусідами, які сидять ліворуч та пра­воруч від нього.

Стіл, що використовується, — круглий і розрахований на N персон (N£20). Дипломат може спілкуватися з дипломатом, який сидить ліво­руч, однією мовою, а з дипломатом, що сидить праворуч, — іншою.

Технічні вимоги:

Вхідний файл: DIPLOMAT. DAT.

Вихідний файл: DIPLOMAT. SOL.

    Програма: diplomat.pas/.c/.cpp

Формат вхідних даних. У першому рядку текстового файла DIPLOMAT. DAT — число N. Далі — N рядків, по одному рядку на диплома­та. Кожен рядок — послідовність слів. Сусідні слова відокремлені пробілом. Кожне слово — це послідовність великих латинських літер. Перше слово — код країни — складається з трьох літер. Друге слово має довжину від 1 до 5 літер і являє собою перелік мов, якими може спілкуватися дипломат. Кожна мова позначена однією літерою. Далі — список з не більш ніж N трилітерних слів — кодів країн, з якими уряд дипломата підтримує дипломатичні стосунки.

Формат вихідних даних. До файла DIPLOMAT. SOL треба вивести список дипломатів у порядку розміщення за столом (по одному дипломату в рядку). Кожен рядок складається з трьох слів: перше — код мови, якою дипломат може спілкуватися з сусідом ліворуч, друге — код країни дипломата, третє — код мови для спілкування з сусідом праворуч. Мож­ливе існування кількох розв'язків. Вам по­трібно знайти один. Якщо розв'язку не існує, то ваша програма має видати таке повідомлен­ня: «NO  SOLUTION EXIST»

Приклад:

DIPLOMAT. DAT

DIPLOMAT. SOL

4

USA EC UCR CHN

CHN GC USA GBR

GBR EG UCR CHN

UCR E USA GBR

C USA E

E UCR E

E GBR G

G CHN C

2

USA ER CHN

CHN CP USA

NO SOLUTION EXIST

Подарунок (uoi2011)

У королівстві Олімпія знаходиться N міст та M двосторонніх доріг, кожна з яких з’єднує рівно два міста. Між двома містами може бути більше однієї дороги. Усі дороги постійно грабуються розбійниками. Останнім часом розбійникам набридло витрачати сили на пограбування і вони звернулися до могутнього і справедливого короля Олімпії з комерційною пропозицією. За цією пропозицією король повинен надіслати розбійникам подарунок, що складається з золотих та срібних монет. У відповідь на люб’язність короля розбійники припинять грабувати певні дороги. Для кожної з доріг встановлена мінімальна кількість золотих і мінімальна кількість срібних монет у подарунку, щоб її пограбування скінчились. Тобто, якщо у подарунку K золотих та L срібних монет, то припиняється пограбування усіх доріг, для яких необхідна кількість золотих монет менша або рівна K, а  кількість срібних монет менша або рівна L.

В скарбниці короля немає жодної золотої або срібної монети, але є Олімпійські Тугрики. Ціна однієї золотої монети в тугриках – G, а срібної – S. Король дуже хоче, щоб після відправлення подарунку розбійникам між кожною парою міст існував хоча б один безпечний шлях, який, можливо, проходить через інші міста.

Завдання Напишіть програму gift, яка за даними про міста і дороги у королівстві та цінами монет, знайде мінімальну кількість тугриків, яку потрібно витратити королю для того, щоб отримати безпечні шляхи між кожною парою міст у королівстві.

Вхідні дані Перший рядок вхідного файлу gift.dat містить два цілих числа N і М (2≤N≤200, 1≤М≤50 000) – кількість міст і кількість доріг у королівстві Олімпія.  Другий рядок містить числа G і S (1≤GS≤109). Наступні М рядків містять інформацію про дороги та опис пропозиції розбійників. У і+2-му рядку вхідного файлу розташовано 4 натуральних числа, перші два з яких – номери міст, що з’єднані і-ою дорогою (міста нумеруються від 1 до N), наступні два – мінімальна кількість золотих і мінімальна кількість срібних монет, що треба вислати розбійникам в подарунку, щоб і-ту дорогу припинили грабувати. Обидва числа не перевищують 109.

Вихідні дані Єдиний рядок вихідного файлу gift.sol має містити одне ціле число – мінімальну кількість тугриків, що потрібно витратити королю на купівлю золотих та срібних монет, щоб досягнути своєї мети, або -1, у випадку, якщо жодна кількість тугриків не допоможе.

Оцінювання Щонайменше у 30% тестів N не буде перевищувати 30 та M не буде перевищувати 150. Щонайменше у 70% тестів M не буде перевищувати 4000.

Приклад вхідних та вихідних даних

gift.dat

gift.sol

3 3

2 1

1 2 10 15

1 2 4 20

1 3 5 1

30

Пояснення: достатньо покласти у подарунок розбійникам 5 золотих та 20 срібних монет і вони відкриють другу та третю дороги. На купівлю цих монет король витратить 30 тугриків.

Музей (uoi2010)

У столиці країни Олімпія збудований Музей Олімпійської Слави, де виставлено нагороди школярів країни з різних предметних олімпіад. Будівля музею складається з виставкових залів, з’єднаних коридорами. Коридор сполучає рівно два зали. Відомо, що кожного залу музею можна дістатися з будь-якого іншого залу, прямуючи коридорами. Також відомо, що кількість коридорів дорівнює кількості залів.

                Вночі музей патрулюється охоронцями. Кількість охоронців дорівнює кількості залів, та у кожен момент часу охоронець доглядає за своїм залом. Кожну годину згідно плану патрулювання деякі з охоронців переходять в іншу залу, а інші залишаються на місті. План патрулювання відповідає таким вимогам:

1. Для кожної зали план задає чи залишиться її охоронець на місці, чи перейде до певної зали, яка сполучена з поточною коридором.

2. Після переходів охоронців, у кожній залі повинен опинитися рівно один охоронець.

3. Кожну годину застосовується один і той самий план патрулювання.

Наприклад, на рисунку наведений один з можливих планів патрулювання. Згідно йому кожну годину охоронець, що знаходиться у залі 1, переходить до залу 2; охоронець з залу 2 – до залу 3; з залу 3 – до залу 1; охоронці з залів 4 та 5 міняються місцями, а охоронець з залу 6 всю ніч проводить у цьому залі.

Завдання Напишіть програму MUSEUM, яка за інформацією про кількість залів музею і їх сполучення коридорами знайде кількість різних планів патрулювання музею за модулем P.

Вхідні дані Перший рядок вхідного файлу MUSEUM.DAT містить пару цілих чисел N (3N≤50 000) – кількість залів у музеї, та P (2P≤10 000). Наступні N рядків містять пари цілих чисел від 1 до N – номери залів, що з’єднані коридором.

Вихідні дані Єдиний рядок вихідного файлу MUSEUM.SOL має містити ціле число – кількість планів патрулювання музею, за модулем P (остачу від ділення шуканої кількості на P).

Оцінювання Щонайменше в 20% тестів буде виконуватись додаткове обмеження N≤20.

Щонайменше в 60% тестів буде виконуватись додаткове обмеження N≤1000.

Приклад вхідних та вихідних даних

MUSEUM.DAT

MUSEUM.SOL

6 1000

1 2

2 3

3 1

3 4

4 5

4 6

20

Існує 20 різних планів патрулювання: (1, 2, 3, 4, 5, 6), (1, 2, 3, 5, 4, 6), (1, 2, 3, 6, 5, 4), (1, 2, 4, 3, 5, 6), (1, 3, 2, 4, 5, 6), (1, 3, 2, 5, 4, 6), (1, 3, 2, 6, 5, 4), (2, 1, 3, 4, 5, 6), (2, 1, 3, 5, 4, 6), (2, 1, 3, 6, 5, 4), (2, 1, 4, 3, 5, 6), (2, 3, 1, 4, 5, 6), (2, 3, 1, 5, 4, 6), (2, 3, 1, 6, 5, 4), (3, 1, 2, 4, 5, 6), (3, 1, 2, 5, 4, 6), (3, 1, 2, 6, 5, 4), (3, 2, 1, 4, 5, 6), (3, 2, 1, 5, 4, 6), (3, 2, 1, 6, 5, 4). На рисунку з умови зображено план (2, 3, 1, 5, 4, 6).

Торговець (uoi2009)

Торговець володіє трьома видами товарів: алмази, яблука та шовк. Для кожного товару відомо вартість у золотих монетах за одиницю ваги та його кількість у торговця.

В країні, де живе торговець, є N міст, які пронумеровані від 1 до N. Рідне місто торговця має номер 1, а столиця – номер N. Щоб дістатися столиці, де торговець може продати товар, йому потрібно проїхати певним маршрутом через інші міста. Між деякими парами міст існують дороги, проїзд по яким коштує певної кількості золотих. У кожному місті стягується податок за провезення кожного з видів товару, заданий у відсотках від вартості провезеного через місто товару. Відомо, що виїхавши з будь-якого міста, торговець не може до нього повернутися. Будь-які два міста з’єднані не більше ніж однією дорогою.

Задача торговця отримати найбільший прибуток – різницю отриманих у столиці коштів за проданий товар та витрат за подорож до столиці. Він не зобов’язаний брати з собою весь свій товар. Торговець завжди має достатньо золотих для виплати податків, та не може розрахуватися товаром, який він везе до столиці. Усі дороги ведуть лише в одному напрямку.

Завдання

Напишіть програму SALESMAN, що за інформацією про кількість одиниць ваги різних видів товару у торговця, ціни на ці товари у столиці, податки у містах, дороги між містами та вартість проїзду  по цих дорогах встановить максимальний прибуток, що може отримати торговець від реалізації товару.

Вхідні дані

Перший рядок вхідного файлу SALESMAN.DAT містить два цілих числа N (2N≤500) та M (M³1) – кількість міст та доріг між ними. Другий рядок містить три цілих невід’ємних числа, що відповідають кількостям одиниць ваги алмазів, яблук та шовку, що належать торговцю. Третій рядок містить три цілих невід’ємних числа – вартість одиниці ваги алмазів, яблук та шовку відповідно. Наступні рядки з 4-го по N+1 містять по три цілих числа від 0 до 100 включно, що відповідають відсоткам від вартості алмазів, яблук та шовку, що стягується у відповідно у містах від 2 до N-1 у якості податку. У списку міст не враховані рідне місто торговця 1 та столиця N, як такі, що не стягують податок. Наступні M рядків містять по три цілих невід’ємних числа, перші два з яких від 1 до N задають пару міст, між якими прокладено дорогу, а третє – вартість проїзду цією дорогою. Дороги ведуть в напрямку від міста, яке вказано першим, до того, яке вказано другим. Кількості одиниць ваги кожного з видів товару у торговця, вартості товарів та ціни проїзду по дорогам не перевищують 100.

Вихідні дані

Єдиний рядок вихідного файлу SALESMAN.SOL має містити одне число – точне значення знайденого максимального прибутку від поїздки до столиці. Відповідь завжди повинна містити рівно два знаки після крапки. У випадках коли торговець не може отримати прибутку чи дістатися столиці існуючими дорогами, потрібно вивести 0.00

Приклад вхідних та вихідних даних

SALESMAN.DAT

SALESMAN.SOL

4 4

10 5 20

100 5 12

15 40 25

90 20 10

1 2 5

1 3 10

3 4 10

2 4 15

1025.00

 
Пошук в глибину PDF Печать E-mail
Добавил(а) Administrator   
02.10.13 00:00

 

 

#include "stdafx.h"

#include "fstream"

using namespace std;

ifstream cin("input.txt");

ofstream cout("output.txt");

int a[101][101],c[101],v1,v2,n,m;

void p(int k, int v)

{c[k]=v;

if (v==v2 || k>=n) {

if (v==v2)

{

//for (int i=1;i<=k;i++)cout<<c[i]<<" ";cout<<endl;

int s=0;

for (int i=1;i<k;i++)s=s+a[c[i]][c[i+1]];

//cout<<"s="<<s<<endl;

if (s<m) m=s;

}

}

else

for (int i=1;i<=n;i++)

if (a[v][i]>0) p(k+1,i);

}

int main()

{int i,j,t,k;

cin>>n>>m;

for (i=1;i<=n;i++)

for (j=1;j<=n;j++)a[i][j]=0;

for (k=1;k<=m;k++)

{cin>>i>>j>>t;

a[i][j]=t;a[j][i]=t;

}

cin>>v1>>v2;

/* for (i=1;i<=n;i++){

for (j=1;j<=n;j++)

cout<<a[i][j]<<" ";

cout<<endl;

}

*/

//cout<<v1<<" "<<v2<<endl;

m=10000000;

p(1,v1);

if (m>=10000000)m=-1;

cout<<m<<endl;

return 0;

}

 

program Project2;

{$APPTYPE CONSOLE}

var a:array[1..100,1..100] of integer;

smin,i,j,k,l,n,s:integer;

rez,c:array [1..100]of integer;

f1,f2:text;

function f(nn,vv:integer):boolean;

var pr:boolean;

i:integer;

begin

pr:=true;

for i:=1 to nn do

if vv=c[i] then pr:=false;

f:=pr;

end;

procedure p(ni,v:integer);

var s,ii:integer;

begin

c[ni]:=v;

if(ni=n)then begin

{***** 1}

s:=0;

for ii:=1 to ni-1 do s:=s+a[c[ii],c[ii+1]];

s:=s+a[c[n],c[1]];

if s<smin then begin

for ii:=1 to ni do rez[ii]:=c[ii];

smin:=s;

end;

end

else

for ii:=1 to n do

if (a[v,ii]>0)and (f(ni,ii)) then p(ni+1,ii);

end;

begin

assign(f1,'graph.dat');reset(f1);assign(f2,'graph.sol');rewrite(f2);

write('N=');

readln(n);

for i:=1 to n do

for j:=i+1 to n do begin

a[i,j]:=random(50)+1;a[j,i]:=a[i,j];

end;

smin:=maxint;

p(1,1);

close(f1);

writeln(f2,n);

for i:=1 to n do begin

for j:=1 to n-1 do

write(f2,a[i,j]:3);

writeln(f2,a[i,n]:3);

end;

writeln(f2,'-------------------');

for i:=1 to n-1 do write(f2,rez[i],' ' );

writeln(f2,rez[n] );

writeln(f2,smin);

close(f2);

end.

 

 

 
Заняття 16.09.2015 PDF Печать E-mail
Добавил(а) Administrator   
16.09.15 00:00

Всеукраїнськiй олімпіадi з інформатики NetOI-2015 (http://www.olymp.vinnica.ua/)

Тренувальний тур

//a

#include <iostream>

using namespace std;

int main()

{int x1,y1,x2,y2,x3,y3,x4,y4;

    cin>>x1>>y1;

    cin>>x2>>y2;

    cin>>x3>>y3;

    cin>>x4>>y4;

int x20=max(x1,x2);

int x10=min(x1,x2);

int x40=max(x3,x4);

int x30=min(x3,x4);

int v=min(x20,x40)-max(x30,x10);

    if (v>=0)cout << v << endl; else cout<<-1;

    return 0;

}

//d

#include <iostream>

#include <string.h>

#include <string>

using namespace std;

int main()

{

    char *n=new char[200000000];

    cin>>n;

    for(int i=0;i<strlen(n)-1;i++)

        for(int j=0;j<strlen(n)-1;j++)

        if(n[j]>n[j+1])swap(n[j],n[j+1]);

int k=0;

while(n[k]=='0')k++;

swap(n[0],n[k]);

    cout << n << " ";

    for(int i=0;i<strlen(n)-1;i++)

        for(int j=0;j<strlen(n)-1;j++)

        if(n[j]<n[j+1])swap(n[j],n[j+1]);

    cout << n << endl;

    return 0;

}

//b

#include <iostream>

using namespace std;

int main()

{long long int n,m,temp;

int k=0;

cin>>n>>m;

for(int i=n;i<=m;i++)

{

    temp=i;

    while (temp%2==0) temp=temp/2;

        while (temp%3==0) temp=temp/3;

            while (temp%5==0) temp=temp/5;

            if (temp==1) k++;

}

    cout << k << endl;

    return 0;

}

//e

#include <iostream>

#include <string.h>

#include <string>

using namespace std;

int main()

{

    char *n=new char[200000000];

    cin>>n;

    for(int j=0;j<strlen(n);j++)

        if(n[j]>='0'&&n[j]<='9')cout<<n[j];

    cout <<  endl;

    return 0;

}

//c

#include <iostream>

using namespace std;

int main()

{long long int n,minn;

int a[100000];

cin>>n;

for(int i=1;i<=n;i++) cin>>a[i];

minn=2000;

for(int i=1;i<=n;i++)

    if(a[i]<minn && a[i]>0)  minn=a[i];

 if(minn==2000)    cout << 0 << endl; else  cout << minn << endl;

    return 0;

}

//f

#include <iostream>

using namespace std;

int main()

{long long int n,k,f,a,b,black,white;

int r[10000];

cin>>n;

for(int i=1;i<=n;i++){

 cin>>k;

white=0;black=0;

    for(int j=1;j<=k;j++)

    {

        cin>>a>>b;

        if ((a%2==0 && b%2==0 )|| (a%2==1 && b%2==1 )) black++; else white++;

    }

    if (white==k || black==k)r[i]=1;else r[i]=0;

}

for(int i=1;i<=n;i++)cout<<r[i];

    cout <<  endl;

    return 0;

}

 


Страница 32 из 43

Статистика

Пользователей : 269
Статей : 225
Просмотрено статей : 127358

Вход/Регистрация

Нет