zoukankan      html  css  js  c++  java
  • A. Recommendations

    VK news recommendation system daily selects interesting publications of one of nn disjoint categories for each user. Each publication belongs to exactly one category. For each category ii batch algorithm selects aiai publications.

    The latest A/B test suggests that users are reading recommended publications more actively if each category has a different number of publications within daily recommendations. The targeted algorithm can find a single interesting publication of ii-th category within titi seconds.

    What is the minimum total time necessary to add publications to the result of batch algorithm execution, so all categories have a different number of publications? You can't remove publications recommended by the batch algorithm.

    Input

    The first line of input consists of single integer nn — the number of news categories (1n2000001≤n≤200000).

    The second line of input consists of nn integers aiai — the number of publications of ii-th category selected by the batch algorithm (1ai1091≤ai≤109).

    The third line of input consists of nn integers titi — time it takes for targeted algorithm to find one new publication of category ii (1ti105)1≤ti≤105).

    Output

    Print one integer — the minimal required time for the targeted algorithm to get rid of categories with the same size.

    Examples
    input
    Copy
    5
    3 7 9 7 8
    5 2 5 7 5
    
    output
    Copy
    6
    
    input
    Copy
    5
    1 2 3 4 5
    1 1 1 1 1
    
    output
    Copy
    0
    
    Note

    In the first example, it is possible to find three publications of the second type, which will take 6 seconds.

    In the second example, all news categories contain a different number of publications.

    ai排下序,对应的t值有重复的就算一下加一位所需的值

    比如样例1,3 7 9 7 8,3没有重复不用管,7有重复,下个数字是8,原来的8对应的值是5,大于之前7对应的2,所以之前那个7再往下数就是9,9对应的值是5,大于最开始从7加上来的所对应的值,7再往下数就是10,无重复,所以值是2*3=6

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    #include <set>
    #include <queue>
    #include <map>
    #include <sstream>
    #include <cstdio>
    #include <cstring>
    #include <numeric>
    #include <cmath>
    #include <iomanip>
    #include <deque>
    #include <bitset>
    //#include <unordered_set>
    //#include <unordered_map>
    //#include <bits/stdc++.h>
    //#include <xfunctional>
    #define ll              long long
    #define PII             pair<int, int>
    #define rep(i,a,b)      for(int  i=a;i<=b;i++)
    #define dec(i,a,b)      for(int  i=a;i>=b;i--)
    #define pb              push_back
    #define mk              make_pair
    using namespace std;
    int dir1[6][2] = { { 0,1 } ,{ 0,-1 },{ 1,0 },{ -1,0 },{ 1,1 },{ -1,1 } };
    int dir2[6][2] = { { 0,1 } ,{ 0,-1 },{ 1,0 },{ -1,0 },{ 1,-1 },{ -1,-1 } };
    const long long INF = 0x7f7f7f7f7f7f7f7f;
    const int inf = 0x3f3f3f3f;
    const double pi = 3.14159265358979;
    const int mod = 100007;
    const int N = 200005;
    //if(x<0 || x>=r || y<0 || y>=c)
    
    inline ll read()
    {
        ll x = 0; bool f = true; char c = getchar();
        while (c < '0' || c > '9') { if (c == '-') f = false; c = getchar(); }
        while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
        return f ? x : -x;
    }
    ll gcd(ll m, ll n)
    {
        return n == 0 ? m : gcd(n, m % n);
    }
    struct node
    {
        int x, y;
    };
    node a[N];
    int n;
    bool cmp(node x, node y)
    {
        return x.x < y.x;
    }
    int main()
    {
        cin >> n;
        rep(i,1,n)
            a[i].x = read();
        rep(i, 1, n)
            a[i].y = read();
        sort(a + 1, a + n + 1, cmp);
        priority_queue<int> q;
        ll cur = 1, cnt = 0, ans = 0, tmp = 0;
        while (!q.empty() || cur < n)
        {
            cnt++;
            if (q.empty())
            {
                cnt = a[cur].x;
                while (cur <= n && cnt == a[cur].x)
                {
                    tmp += a[cur].y;
                    q.push(a[cur].y);
                    cur++;
                }
            }
            else
            {
                while (cnt == a[cur].x && cur <= n)
                {
                    tmp += a[cur].y;
                    q.push(a[cur].y);
                    cur++;
                }
            }
            tmp -= q.top();
            q.pop();
            ans += tmp;
        }
        cout << ans << endl;
        return 0;
    }
  • 相关阅读:
    flutter Sliver滑动视图组件
    Ionic4.x、Cordova Android 检测应用版本号、服务器下载文件以及实现App自动升级、安装
    flutter SnackBar 底部消息提示
    Flutter ExpansionPanel 可展开的收缩控件
    Ionic4 Cordova 调用原生硬件 Api 实现扫码功能
    Flutter BottomSheet底部弹窗效果
    Flutter 中AlertDialog确认提示弹窗
    Ionic Cordova 调用原生 Api 实现拍照上传 图片到服务器功能
    Flutter 中SimpleDialog简单弹窗使用
    Springboot项目mysql日期存储不匹配问题和在idea本地可以运行起来,但打包jar后运行报找不到mysql驱动的解决方案
  • 原文地址:https://www.cnblogs.com/dealer/p/12776443.html
Copyright © 2011-2022 走看看