• Minimize the error


    You are given two arrays A and B, each of size n. The error, E, between these two arrays is defined . You have to perform exactly k1 operations on array A and exactly k2 operations on array B. In one operation, you have to choose one element of the array and increase or decrease it by 1.

    Output the minimum possible value of error after k1 operations on array A and k2 operations on array B have been performed.

    Input

    The first line contains three space-separated integers n (1 ≤ n ≤ 103), k1 and k2 (0 ≤ k1 + k2 ≤ 103, k1 and k2 are non-negative) — size of arrays and number of operations to perform on A and B respectively.

    Second line contains n space separated integers a1, a2, ..., an ( - 106 ≤ ai ≤ 106) — array A.

    Third line contains n space separated integers b1, b2, ..., bn ( - 106 ≤ bi ≤ 106)— array B.

    Output

    Output a single integer — the minimum possible value of after doing exactly k1 operations on array A and exactly k2 operations on array B.

    Examples
    Input
    Copy
    2 0 0
    1 2
    2 3
    Output
    Copy
    2
    Input
    Copy
    2 1 0
    1 2
    2 2
    Output
    Copy
    0
    Input
    Copy
    2 5 7
    3 4
    14 4
    Output
    Copy
    1
    Note

    In the first sample case, we cannot perform any operations on A or B. Therefore the minimum possible error E = (1 - 2)2 + (2 - 3)2 = 2.

    In the second sample case, we are required to perform exactly one operation on A. In order to minimize error, we increment the first element of A by 1. Now, A = [2, 2]. The error is now E = (2 - 2)2 + (2 - 2)2 = 0. This is the minimum possible error obtainable.

    In the third sample case, we can increase the first element of A to 8, using the all of the 5 moves available to us. Also, the first element of B can be reduced to 8 using the 6 of the 7 available moves. Now A = [8, 4] and B = [8, 4]. The error is now E = (8 - 8)2 + (4 - 4)2 = 0, but we are still left with 1 move for array B. Increasing the second element of B to 5 using the left move, we get B = [8, 5] and E = (8 - 8)2 + (4 - 5)2 = 1.

    题解:摘自codeforce

    The problem can be interpreted as follows: array B is fixed and a total of k1 + k2 = K operations allowed on A. Let the array C be defined as Ci = |Ai - Bi| Now this is just a simple greedy problem where value of is to be minimized after exactly K subtraction/addition operations spread over the elements of array C.

    1. Till E is non-zero, the largest element is chosen and 1 is subtracted from it. This is done as currently we want to maximize the reduction in error per operation and decreasing an element x by 1 reduces error by x2 - (x - 1)2 = 2·x - 1.
    2. Once all the elements become zero, we can use the remaining moves to alternately increase and decrease the same element till we run out of moves.

    This can be implemented using a priority queue or by sorting the array C and iterating over it.

    Expected complexity: O(N·K·log(N)) or O(N·log(N))

    感受:好题。和wanfly1交流赛的B有相同的特点,不过需要思考得多一点。将k1和k2看作是同一种操作,然后固定一个序列,转化为对序列c得操作。贪心体现在使用一次操作,最多能减少2*x-1,与x有关,所以要不断找最大值来进行操作。好题!!!!,同时学习了一波代码。

     1 #pragma warning(disable:4996)
     2 #include<bitset>
     3 #include<queue>
     4 #include<vector>
     5 #include<string>
     6 #include<cstdio>
     7 #include<cstring>
     8 #include<iostream>
     9 #include<algorithm>
    10 using namespace std;
    11 typedef long long ll;
    12 
    13 int n, k1, k2;
    14 priority_queue<ll> p;
    15 
    16 int main()
    17 {
    18     while (cin >> n >> k1 >> k2) {
    19         vector<ll> a(n), b(n), arr(n);
    20         int k = k1 + k2;
    21         for (int i = 0; i < n; i++) cin >> a[i];
    22         for (int i = 0; i < n; i++) {
    23             cin >> b[i];
    24             arr[i] = abs(a[i] - b[i]);
    25             p.push(arr[i]);
    26         }
    27         while (k > 0) {
    28             ll tp = p.top();
    29             p.pop();
    30             p.push(abs(tp - 1));  //一定要取绝对值,当最大值是0的时候。
    31             k--;
    32         }
    33         ll ans = 0;
    34         while (!p.empty()) {
    35             ll tp = p.top();
    36             p.pop();
    37             ans += tp * tp;
    38         }
    39         cout << ans << endl;
    40     }
    41 
    42 }
  • 相关阅读:
    【FROM】java控件重绘AWT/SWINGPainting in AWT and Swing (EN)
    linux yum使用管理详细使用
    远程控制 vc++实现
    java 鼠标事件Dragged和Moved 及java显示GIF在JLabel、JButton
    C语言字符串函数大全
    C# 训练场(四)创建系统热键,并向活动窗口输入信息
    潜移默化学会WPF(样式) DataGrid(转载)
    时间查询
    Sqlserver2012 根据数据库mdf文件生成log文件,解决无法附加mdf文件
    我知道的一些 ”运行“ 窗体下的命令,个人使用
  • 原文地址:https://www.cnblogs.com/zgglj-com/p/8798338.html
Copyright © 2020-2023  润新知