Форум Всеукраїнської інтернет-олімпіади NetOI


На форумі обговорюються лише питання, пов'язані з олімпіадою

Ви не зайшли.

#1 2015-11-12 16:52:49

LVV
Олімпієць
Звідки: Олешки
Зареєстрований: 2010-11-19
Повідомлень: 360
Вебсайт

Розбір рішень Задача Сhain2015

Рішення LVV
Робота дорівнює зміні потенціальної енергії вантажу A=mg∆h. Якщо нумерувати точки від 0 (верхня) до N-1(нижня), то висота підняття кожної точки дорівнює h+(N-1-i)*L, де і – це номер точки на ланцюжку.

Код:

#include <iostream>
using namespace std;
int main()
{
int N,L,h;
    cin >> N >> L >> h;

    int *M = new int [N];
        for(int i=0; i<N; i++)
            cin >> M[i];

long long int A=0;

for(int i=0; i<N; i++)
    A+=M[i]*10*(h+(N-1-i)*L);
    
cout << A;
    return 0;
}

Вік живи - вік навчайся.

Поза форумом

 

#2 2015-11-12 23:55:21

FordPerfect
Новий користувач
Зареєстрований: 2014-11-15
Повідомлень: 30

Re: Розбір рішень Задача Сhain2015

На правах оффтопика:
http://www.physbook.ru/index.php/Kvant._Веревочка

Поза форумом

 

#3 2015-11-18 17:58:36

jurij
Новий користувач
Зареєстрований: 2009-01-23
Повідомлень: 40

Re: Розбір рішень Задача Сhain2015

LVV написав:

Рішення LVV
Робота дорівнює зміні потенціальної енергії вантажу A=mg∆h. Якщо нумерувати точки від 0 (верхня) до N-1(нижня), то висота підняття кожної точки дорівнює h+(N-1-i)*L, де і – це номер точки на ланцюжку.

Код:

#include <iostream>
using namespace std;
int main()
{
int N,L,h;
    cin >> N >> L >> h;

    int *M = new int [N];
        for(int i=0; i<N; i++)
            cin >> M[i];

long long int A=0;

for(int i=0; i<N; i++)
    A+=M[i]*10*(h+(N-1-i)*L);
    
cout << A;
    return 0;
}

Можно обойтись и без массива, рассчитывая во входном потоке. Кроме того при определенных условиях может произойти превышение значения int в A+=M[i]*10*(h+(N-1-i)*L); например:1000*10*(99+(999-1-0)*99)
Я делал приведение типа
int main()
{
  int h,l,m,n,i;
  long long res=0;
  cin >> n >> l >> h;
  for (i=0;i<n;i++) {cin >> m; res=res+m*((long long)(n-1-i)*l+h);}
  cout << res*10;
  return 0;
}

Поза форумом

 

#4 2015-11-19 03:41:03

LVV
Олімпієць
Звідки: Олешки
Зареєстрований: 2010-11-19
Повідомлень: 360
Вебсайт

Re: Розбір рішень Задача Сhain2015

jurij написав:

Я делал приведение типа  res=res+m*((long long)(n-1-i)*l+h)

+


Вік живи - вік навчайся.

Поза форумом

 

#5 2015-11-23 13:53:52

Belitoron
Новий користувач
Зареєстрований: 2015-11-13
Повідомлень: 5

Re: Розбір рішень Задача Сhain2015

А можна було ВСІ змінні оголосити long long і не переживати про приведення типів і переповнення.

Доречі, чисто заради естетичної краси і простоти сприйняття я цикл організував трохи інакше:

Код:

long long N, L, H, M, h, g=10, A=0;
cin>>N>>L>>H;
for(h=(N-1)*L+H; h>=H; h-=L){
    cin>>M;
    A += M*g*h;
}
cout<<A;

Хоч це і зовсім не принципово, але погодьтесь, так формула і рішення в цілому виглядають більш інтуїтивно зрозумілими

Відредаговано Belitoron (2015-11-23 14:03:02)

Поза форумом

 

Нижній колонтитул

Powered by Likt
© Copyright 2002–2009 Likt