• 第十四届蓝桥杯省赛大学B组(C/C++)整数删除


    原题链接:整数删除

    给定一个长度为 N 的整数数列:A1,A2,...,AN。

    你要重复以下操作 K 次:

    每次选择数列中最小的整数(如果最小值不止一个,选择最靠前的),将其删除,并把与它相邻的整数加上被删除的数值。

    输出 K 次操作后的序列。

    输入格式

    第一行包含两个整数 N 和 K。

    第二行包含 N 个整数,A1,A2,A3,...,AN。

    输出格式

    输出 N−K个整数,中间用一个空格隔开,代表 K 次操作后的序列。

    数据范围

    对于 20% 的数据,1≤K 对于 100% 的数据,1≤K

    输入样例:

    1. 5 3
    2. 1 4 2 8 7

    输出样例:

    17 7
    

    样例解释

    数列变化如下,中括号里的数是当次操作中被选择的数:

    1. [1] 4 2 8 7
    2. 5 [2] 8 7
    3. [7] 10 7
    4. 17 7

     解题思路:

    此题主要用优先队列+双端链表,优先队列可以替换成能够进行排序的也可,比如set(去重+自动排序),这里利用优先队列实现。利用小根堆,每次弹出来为最小值去更新原数组的值。这里需要判断一下,由于更新值在原数组中更新,优先队列中的值没有被更新,每次进入循环,先要进行判断原数组的值是否与优先队列中的值相等,不相等就更新,相等就按照删除继续操作,k--


    代码实现:

    1. #include
    2. #include
    3. #define int long long
    4. using namespace std;
    5. const int N=5e5+5;
    6. typedef pair<int,int> PII;
    7. struct{
    8. int pre,num,next;//pre前一个下标,next后一个下标,num当前值
    9. }a[N];
    10. int n,k;
    11. signed main(){
    12. priority_queue,greater> pq;//小根堆
    13. cin>>n>>k;
    14. for(int i=1;i<=n;i++){
    15. cin>>a[i].num;
    16. a[i].pre=i-1;//记录前驱
    17. a[i].next=i+1;//记录后驱
    18. pq.push(make_pair(a[i].num,i));//把此点数值与下标入队
    19. }
    20. while(k){//删除k个数
    21. PII cur=pq.top();//小根堆,每次弹出都是最小值
    22. pq.pop();
    23. int id=cur.second,w=cur.first;//记录弹出的下标与值
    24. int l=a[id].pre,r=a[id].next;//记录前后驱
    25. if(w!=a[id].num){//如果队列中的值与原数组更新后的不相等
    26. pq.push(make_pair(a[id].num,id));//把新值入队
    27. continue;//k不动,更新操作
    28. }//else就是删除更新操作
    29. k--;
    30. a[l].num+=w;//前一个加w
    31. a[r].num+=w;//后一个加w
    32. a[l].next=r;//双端队列删除id结点
    33. a[r].pre=l;
    34. a[id].num=0;//删掉了为0
    35. }
    36. for(int i=1;i<=n;i++){
    37. if(a[i].num){
    38. cout<" ";
    39. }
    40. }
    41. return 0;
    42. }
  • 相关阅读:
    HTML案例-4.注册页面表单练习
    RocketMQ消息批处理与消峰填谷
    docker下快速部署openldap与PHPLdapAdmin
    软考 --- 软件工程(1)概念、开发模型
    Multi Modal Smart Diagnosis of Pulmonary Diseases
    【深度学习】图像分类数据集Fashion-MNIST
    springboot+网络空间安全实验教学中心门户网站 毕业设计-附源码191220
    java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis
    2216.美化数组的最少删除数
    Spring Boot 日志文件 ——打印日志和日志持久化详解
  • 原文地址:https://blog.csdn.net/m0_73633807/article/details/137402624