답안 #530958

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
530958 2022-02-27T08:11:05 Z N1NT3NDO Akcija (COCI21_akcija) C++14
0 / 110
884 ms 357732 KB
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
#define sz(x) (int)x.size()
#define fi first
#define sd second
#define all(x) x.begin(), x.end()
//#pragma GCC target ("avx2")
//#pragma GCC optimization ("O3")
//#pragma GCC optimization ("unroll-loops")

using namespace std;
//using namespace __gnu_pbds;

//typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

//#define int long long

const ll inf = (ll)1e15;
const int N = 2100;
ll w[N], dp[N][3][N];
int n, k, d[N], nom[N];

vector< pair<ll, ll> > ans;

bool cmp(int i, int j)
{
    return d[i] < d[j];
}

bool cmp2(pair<ll, ll> a, pair<ll, ll> b)
{
    if (a.fi < b.fi) return 0;
    else if (a.fi == b.fi)
    {
        if (a.sd < b.sd)
          return 1;
        else return 0;
    }
    else return 1;
}


int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> k;
    for(int i = 1; i <= n; i++)
    {
        cin >> w[i] >> d[i];
        nom[i] = i;
    }

    sort(nom + 1, nom + n + 1, cmp);
    for(int i = 0; i <= n; i++)
      for(int j = 0; j <= 2; j++)
        for(int c = 0; c <= n; c++)
          dp[i][j][c] = inf;

    for(int i = 0; i <= n; i++) dp[i][0][0] = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= min(i, 2); j++)
        {
            for(int time = 0; time <= n; time++)
            {
                dp[i][j][time] = min(dp[i][j][time], dp[i - 1][j][time]);
                if (time < d[nom[i]] && dp[i][j][time + 1] > dp[i - 1][j - 1][time] + w[nom[i]])
                {
                    dp[i][j][time + 1] = dp[i - 1][j - 1][time] + w[nom[i]];
                }
            }
        }
    }

    for(int i = 0; i <= n; i++)
      for(int j = 0; j <= 2; j++)
        for(int time = 0; time <= n; time++)
        {
            if (dp[i][j][time] == inf)
              ans.pb({0, 0});
            else ans.pb({j, dp[i][j][time]});
        }

    sort(ans.begin(), ans.end(), cmp2);

    for(int i = 0; i < k; i++)
    {
        cout << ans[i].fi << ' ' << ans[i].sd << '\n';
    }
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 876 ms 357724 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 876 ms 357724 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 884 ms 357732 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 588 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 2256 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 876 ms 357724 KB Output isn't correct
2 Halted 0 ms 0 KB -