На форумі обговорюються лише питання, пов'язані з олімпіадою
Ви не зайшли.
Рішення 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; }
Поза форумом
На правах оффтопика:
http://www.physbook.ru/index.php/Kvant._Веревочка
Поза форумом
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;
}
Поза форумом
А можна було ВСІ змінні оголосити 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)
Поза форумом