zoukankan      html  css  js  c++  java
  • 小明的账单(信息学奥赛一本通 1372)

    【题目描述】

    小明在一次聚会中,不慎遗失了自己的钱包,在接下来的日子,面对小明的将是一系列的补卡手续和堆积的账单… 在小明的百般恳求下,老板最终同意延缓账单的支付时间。可老板又提出,必须从目前还没有支付的所有账单中选出面额最大和最小的两张,并把他们付清。还没有支付的账单会被保留到下一天。 请你帮他计算出支付的顺序。

    【输入】

    第1行:一个正整数N(N≤15,000),表示小明补办银联卡总共的天数。

    第2行到第N+1 行:每一行描述一天中收到的帐单。先是一个非负整数M≤100,表示当天收到的账单数,后跟M个正整数(都小于1,000,000,000),表示每张帐单的面额。

    输入数据保证每天都可以支付两张帐单。

    【输出】

    输出共N 行,每行两个用空格分隔的整数,分别表示当天支付的面额最小和最大的支票的面额。

    【输入样例】

    4 3 3 6 5 2 8 2 3 7 1 7 0

    【输出样例】

    3 6 2 8 1 7 5 7


    一开始看到这道题,我的困扰是如何取出小根堆里的最大值(或者是大根堆里的最小值),后来干脆定义了两个优先队列,一个专用取最大值,一个取最小值(其实是有漏洞的,因为两个队列里的值没有实时更新,会出现重叠)

     一开始的代码的这样的:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 priority_queue<int> h;
     4 priority_queue<int,vector<int>,greater<int> >q;
     5 int main()
     6 {
     7     int n;cin>>n;
     8     while(n--)
     9     {
    10         int m,x;cin>>m;
    11         for(int i=1;i<=m;i++)
    12         {
    13             cin>>x;
    14             h.push(x);
    15             q.push(x);
    16         }
    17         cout<<q.top()<<' '<<h.top()<<endl;
    18         h.pop();q.pop();
    19     }
    20     return 0;
    21 }

    在一本通网站上提交了之后竟然还得了80分,看来数据有点水(主要靠运气)

    后来仔细想了想这道题目其实肥肠简单,用下multiset就可以啦,所以说STL是很重要弟,可以减少不少的代码量呢

    (关于multiset的用法,请看☟

    【C++ STL】Set和Multiset 怎么用咧↓↓↓ - endl - 博客园
    https://www.cnblogs.com/ljy-endl/p/11257825.html)

    本题代码如下:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 multiset<int> st;//定义int类型的set
     4 int main()
     5 {
     6     int n;
     7     cin>>n;
     8     st.clear();
     9     for(int i=1;i<=n;i++)
    10     {
    11         int m;
    12         cin>>m;
    13         for(int j=1;j<=m;j++)
    14         {
    15             int a;
    16             cin>>a;
    17             st.insert(a);//插入元素
    18         }
    19 
    20         cout<<*st.begin()<<" ";//输出最小元素
    21         st.erase(st.begin());//删除set中最小元素
    22         cout<<*(--st.end())<<endl;//输出最大元素
    23         st.erase(--st.end());//删除set中最大元素
    24     }
    25 
    26     return 0;
    27 }
  • 相关阅读:
    border-radius
    border-style
    border-width
    border
    max-width
    min-width
    clip 语法
    left
    z-index
    position
  • 原文地址:https://www.cnblogs.com/ljy-endl/p/11262749.html
Copyright © 2011-2022 走看看