ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1005. Куча камней

AC with dinamic O(n * sum(1..n) * 2)
Послано 4llower 27 окт 2018 04:44
#include <bits/stdc++.h>

#define rust(a, b, c, d) sqrt(sqr(a - c) + sqr(b - d))
#define sqr(a) (a)*(a)
#define m_p make_pair
#define fi first
#define se second
#define fast_io ios_base::sync_with_stdio(0);cin.tie(0);
#define endl "\n"
#define pll pair <ll,ll>
#define next yamogu
typedef long long ll;
const int MAXINT=2147483640;
const ll MAXLL=9223372036854775800LL;
const ll MAXN=1e6;
const double eps = 1e-9;
const ll mod = 1e9 + 7;
using namespace std;
ll n, a[MAXN], old[4 * MAXN + 100], next[4 * MAXN + 100];
int main() {
    srand(time(0));
//    freopen("input.txt","r",stdin);
//    freopen("output.txt","w",stdout);
    fast_io;
    cin >> n;
    for (int i = 0; i < n; ++i) cin >> a[i];
    old[2 * MAXN] = 1;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j <= 4 * MAXN; ++j){
            if (j + a[i] <= 4 * MAXN && old[j]){
                next[j + a[i]] |= old[j];
            }
            if (j - a[i] >= 0 && old[j]){
                next[j - a[i]] |= old[j];
            }
        }
        for (int j = 0; j <= 4 * MAXN; ++j) {
            old[j] = next[j];
            next[j] = 0;
        }
    }
    ll mx = MAXLL;
    for (int i = 0; i <= 4 * MAXN; ++i) if (old[i]){
        mx = min(abs(i - 2 * MAXN), mx);
    }
    cout << mx << endl;
    return 0;

}