2021CCPC华为云挑战赛题A

该博客介绍了2021年CCPC华为云挑战赛的一道题目,涉及数据对象的聚合问题。题解提到,通过使用贪心策略,用一个数组配合从大到小的优先队列,尝试将2的整数次幂的数据对象存储在有限的空间中。如果所有对象都能被存储,则输出Yes,否则输出No。
摘要由CSDN通过智能技术生成

题意:
给定 n 个大小 A1,A2,⋯,An 为 2 的整数次幂的数据对象,以及 m 个剩余空间为 B1,B2,⋯,Bm 的分条。问是否可以通过对数据对象进行聚合,使得能用现有的 m 个分条把所有 n 个对象存下来。T 组数据。

知识点:
贪心

题解:
用一个数组储存第一组数据,再使用一个从大到小的优先队列储存空间,根据贪心的思想不断将数组中的最大值存入最大空间,如果能完成一轮遍历就输出Yes,否则输出No。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

priority_queue<LL,vector<LL>,less<LL> > p;
 
int main () {
    // ios::sync_with_stdio(false);
    // cin.tie(0);
    // cout.tie(0);

    LL tt;
    cin >> tt;
    while (tt -- ) {

        LL n, m;
        cin >> n >> m;
        LL q[n + 1], p1[n + 1];
        LL sum1 = 0, sum2 = 0;
        bool flag = false;

        while (p.empty() == false) {
            p.pop();
        }

        for (int i = 1; i <= n; i ++ ) {
            cin >> q[i];
            sum1 += q[i];
        }

        for (int i = 1; i <= m; i ++ ) {
            cin >> p1[i];
            sum2 += p1[i];
            p.push(p1[i]);
        }

        if (sum1 > sum2) {
            cout << "No" << endl;
            continue;
        }

        sort (q + 1, q + n + 1, greater<int>());

        for (int i = 1; i <= n; i ++ ) {
            LL res = p.top ();
            if(res < q[i]) break;

			p.push (res - q[i]);
            p.pop();

			if(i == n) flag = true;
        }
        // cout << "#########" << endl;
        // for (int i = 1; i <= m; i ++ ) cout << p[i]  << " ";
        // cout << endl;
        if (flag == true) {
            cout << "Yes" << endl;
        }else {
            cout << "No" << endl;
        }
        // cout << "#########" << endl;
    }   
    
    //system ("pause");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pale_B

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值