SDNU_ACM_ICPC_2020_Winter_Practice_2nd H 优先队列 贪心

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大意
两个长度为n的数组A,B
对A进行K1运算,对其中一个数 +1或-1
对B进行K2运算,对其中一个数 +1或-1
在这里插入图片描述的最小值

思路

Bi+1 《=》Ai-1
Bi-1 《=》Ai+1
所以可以看成是对A序列进行K1+K2次操作,B不操作

那么优先对 | Ai - Bi | 最大值对应的Ai进行操作

利用优先队列 寻找最优Ai

AC代码

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<string.h>
#include<vector>
#include<cmath>
#include <queue>
using namespace std;
typedef long long ll;
struct pp
{
    int a;
    int b;
    bool operator<(const pp &x)const{
        return abs(a-b)<abs(x.a-x.b);
     }
}s[1007];
priority_queue<pp> q;
int main()
{
    ll ans=0;
    int n,k1,k2;
    pp t;
    cin>>n>>k1>>k2;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&s[i].a);
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&s[i].b);
    }
    for(int i=1;i<=n;i++) q.push(s[i]);
    for(int i=1;i<=k1+k2;i++)
    {
        t=q.top();
        q.pop();
        if(t.a>t.b)t.a--;
        else t.a++;
        q.push(t);
    }
    while(!q.empty())
    {
        t=q.top();
        q.pop();
        ans+=1ll*(t.a-t.b)*(t.a-t.b);
        ///1LL是为了在计算时,把int类型的变量转化为long long,然后再赋值给long long类型的变量
    }
    printf("%lld\n",ans);
    return 0;
}

发布了46 篇原创文章 · 获赞 0 · 访问量 1145

猜你喜欢

转载自blog.csdn.net/weixin_45719073/article/details/104269072