D wa on pre5
  • 板块学术版
  • 楼主__vector__
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/10/1 08:37
  • 上次更新2023/11/2 16:51:44
查看原帖
D wa on pre5
507348
__vector__楼主2023/10/1 08:37

对不起,我刚刚那个帖把代码贴成 B 的了。

#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = a; i <= b; i++)
#define REP(i, a, b) for (int i = a; i >= b; i--)
#define pb push_back()
#define mkpr make_pair
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int maxn = 5005;
int t;
int n;
ll a[maxn];

int main()
{
    scanf("%d", &t);
    while (t--)
    {
        map<ll, int> vis;
        scanf("%d", &n);
        ll premex = 0;
        FOR(i, 1, n)
        {
            scanf("%lld", &a[i]);
            vis[a[i]]++;
            while (vis[premex])
                premex++;
        }
        sort(a + 1, a + n + 1);
        int firf0 = n + 1;
        FOR(i, 1, n)
        {
            if (a[i] != 0)
            {
                firf0 = i;
                break;
            }
        }
        ll ans = 0;
        FOR(i, 2, firf0 - 1)
        {
            ans += premex;
        }
        if (firf0 != n + 1&&firf0!=1)
        {
            ll res = 0;
            int lxd = 0;
            FOR(i, firf0, n)
            {
                if (i == firf0 || a[i] == a[i - 1])
                {
                    lxd++;
                    continue;
                }
                else
                {
                    ll oldpre = premex;
                    res = (ll)premex * (ll)(lxd - 1);
                    vis[a[i - 1]] = 0;
                    premex = min(premex, a[i - 1]);
                    res += premex;
                    ll oo = res + (ll)max(0, firf0 - 2) * premex;
                    ans = min(ans, oo);
                 //      printf("0 num = %d oo = %lld\n",a[i-1],oo);
                    lxd = 1;
                    premex = oldpre;
                }
            }
            //  printf("premx = %lld\n",premex);
      //      printf("lxd = %d\n",lxd);
            ll oldpre = premex;
            res = (ll)premex * (ll)(lxd - 1);
            vis[a[n]] = 0;
            premex = min(premex, a[n]);
            res += premex;
          //      printf("premx = %lld\n",premex);
            //    printf("res = %lld\n",res);
        //    printf("prere = %lld\n",res);
            ll oo = res + (ll)max(0, firf0 - 2) * premex;
            ans = min(ans, oo);
        //         printf("num = %d oo = %lld\n",a[n],oo);
            lxd = 1;
            premex = oldpre;
        }

        printf("%lld\n", ans);
    }
    return 0;
}
  
2023/10/1 08:37
加载中...