Информатика
   
Низове

Авторски задачи

Машина на времето (Задача D6 - НОИ-3, Плевен, 2010 г.)

Изобретателят Айн Щайн създал машина на времето. Машината пътувала в кръг, като по часовник.  Tръгвала от настоящата 2010 година и пътувала напред в бъдещето до 4020 година. Щом я достигнела се пренасяла в година 1005 след Христа и пак тръгвала напред към настоящето.
Изобретателят Щайн разрешавал пътуване само ако желаещият успее да реши задача и отговори на въпроса в коя точно година ще го пренесе машината. Желаещите получават текст до 18 символа, в който има поне една цифра, различна от нула. Отделят се само цифрите (
k на брой)  и с тях се образуват най-голямото и най-малкото възможни k-цифрени числа, като всяка цифра участва точно един път.  Разликата на тези две числа показва колко години ще пътува машината, тръгвайки от 2010 и пътувайки в кръга.
Помогнете на малкия изследовател Все Знайко, като създадете програма machine, която извежда точната година, в която машината ще се пренесе.


Ограничения:
1<=k<=18


Вход: На стандартния вход се въвежда текст до 18 символа.
Изход: На стандартния изход се извежда годината, в която машината ще се пренесе.

Пример:                                                                           

вход

изход

 

TiMe312MacHiNe

 

2208

 

Задачата може да бъде решена по следния начин:
Отделят се цифрите от низа в масив и се сортират. Генерират се най-голямото и най-малкото число. При генерирането на най-малкото число трябва да се съобрази, че за да бъде то k – цифрено не трябва да има водещи нули. Намира се разликата им и се изчислява в коя година ще попадне машината при движението си в описания кръг.

 

Програмна реализация:
#include<iostream>
#include<string>
using namespace std;

int main()
{
char niz[20];
int i,j,swap,n,k=0,a[20],p;
unsigned long long A=0,B=0,C;
cin.getline(niz,20);
n=strlen(niz);

for(i=0;i<n;i++)
{
if(niz[i]>=48 && niz[i]<=57)
{
a[k]=niz[i]-48;
k++;
}
}
for(i=0;i<k-1;i++)
for(j=0;j<k-i-1;j++)
if(a[j]<a[j+1])
{
swap=a[j];
a[j]=a[j+1];
a[j+1]=swap;
}

for(i=0;i<k;i++)
A=A*10+a[i];

p=k-1;
if(a[p]==0)
{

           while(a[p]==0&&p>0) p--; 
a[k-1]=a[p];
a[p]=0;
}
for(i=0;i<k;i++)             
B=B*10+a[k-i-1];

C=((A-B)+1005)%3015+1005;
cout<<C<<endl;
return 0;
}

 

ДУМИ (Задача В1, НОИ-1, 2010 г.)

           
Всяка дума има свое тегло. То се определя от номерата на буквите в думата и от тяхната позиция.
Букви  A и a имат номер 1, букви B и b  – номер 2, букви C и c –  номер 3, … , букви Z и z  имат номер 26.
Теглото на думата се определя по следния начин  – номерът на първата буква се умножава по едно,  на втората – по две, на третата – по 4, на четвъртата – по 8, на петата – по 16  и т.н. Сборът на тези произведения  определя колко „тежи” дадената дума.. Например теглото на думата Kod се изчислява така:
11 x 1 + 15 x 2 + 4 x 4 = 57.

Напишете програма dumi, която за дадено множество от думи намира най-тежката дума.

            Вход: От първия ред на стандартния вход се въвежда броя на думите n, а от следващите n реда самите думи.
           
           
Изход: На стандартния изход да се изведе „най-тежката” дума. Ако има няколко „най-тежки” думи, да се изведе първата по реда на въвеждане.

            Ограничения
2 <  n < 100
Всяка от дадените думи има най-много 20  букви.

 

Пример:                                                                           

вход

изход

3       
Kod
dEn
QweRtY

QweRtY