牛客网编程小结(四)——map

交易清单(京东2016实习生真题)
金融证券行业超好的薪酬待遇,吸引了大批的求职者前往应聘,小东也不例外,准备应聘一家证券公司。面试官为考察她的数据分析、处理和编码能力,为她准备了以下问题。
股票交易中,委托是指股票交易者在证券公司买卖股票。每手委托包括一个委托单号i、价格pi、买入或卖出标记di及交易数量qi。
交易处理中,需要把同类业务(买入或卖出)中相同价格的所有委托合并起来,形成一个清单。清单的第一部分为按价格降序排列的合并后的卖出委托,紧随其后的是按相同顺序排列的买入合并委托。证券公司比较关心的是比较抢手的s条合并委托信息,需要得到买入及卖出最抢手的s条合并委托。对于买入委托,抢手的是指报价高的委托,而卖出委托中报价低的较为抢手。若买或卖的合并委托数小于s条,则全部列入清单中。
现在小东拿到的是n个委托,请你帮忙找出最抢手的s个合并委托。

输入
输入有若干组,每组的第一行为两个正整数n和s(1<=n<=1000,1<=s<=50),分别表示委托数和最抢手的清单数,接下来的n行为具体的委托信息,每行包含3部分,第一部分为一个字母‘B’或‘S’,表示买入或卖出,后两部分为两个整数p和q,表示报价和数量。任何卖出委托的报价都比买入委托的报价高。
样例输入
6 2
B 10 3
S 50 2
S 40 1
S 50 6
B 20 4
B 25 10
输出
输出不超过2s行合并委托清单,格式与输入相同。
样例输出
S 50 8
S 40 1
B 25 10
B 20 4
时间限制C/C++语言:1000MS
其他语言:3000MS
内存限制C/C++语言:65536KB
其他语言:589824KB
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    unsigned s;
    while(cin>>n>>s)
    {
        map<int,int> buy,sell;//买入,卖出
        //处理输入,存入map
        for(int i=0;i<n;i++)
        {
            string temp;
            int p,q;
            cin>>temp;
            cin>>p>>q;
            //买入和卖出的处理
            if(temp=="B")
            {
                if(buy.find(p)==buy.end())
                    buy[p]=q;
                else
                    buy[p]+=q;
            }
            else if(temp=="S")
            {
                if(sell.find(p)==sell.end())
                    sell[p]=q;
                else
                    sell[p]+=q;
            }
        }
        //实际要打印的数量
        int sCount=sell.size()<s?sell.size():s;
        int bCount=buy.size()<s?buy.size():s;
        //卖出后移
        map<int,int>::iterator it=sell.begin();
        for(int i=0;i<sCount-1;i++)
            it++;
        //打印数量
        for(;sCount>0;it--,sCount--)
            cout<<"S "<<it->first<<" "<<it->second<<endl;
        for(map<int,int>::reverse_iterator it=buy.rbegin();bCount>0;it++,bCount--)
            cout<<"B "<<it->first<<" "<<it->second<<endl;
    }
}
最大映射
有 n 个字符串,每个字符串都是由 A-J 的大写字符构成。现在你将每个字符映射为一个 0-9 的数字,不同字符映射为不同的数字。这样每个字符串就可以看做一个整数,唯一的要求是这些整数必须是正整数且它们的字符串不能有前导零。现在问你怎样映射字符才能使得这些字符串表示的整数之和最大?
输入描述:
每组测试用例仅包含一组数据,每组数据第一行为一个正整数 n , 接下来有 n 行,每行一个长度不超过 12 且仅包含大写字母 A-J 的字符串。 n 不大于 50,且至少存在一个字符不是任何字符串的首字母。
输出描述:
输出一个数,表示最大和是多少。
输入例子:
2ABCBCA
输出例子:
1875
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<algorithm>
#include<map>
using namespace std;
bool cmp(pair<char,long>a,pair<char,long>b)
{
    return a.second>b.second;
}
int main()
{
    int n;
    while(cin>>n)
    {
        map<char,long long>m;
        set<char> f;//保存首字母
        for(int i=0;i<n;i++)
        {
            string s;
            cin>>s;
            long long b=1;
            for(string::reverse_iterator i=s.rbegin();i<s.rend();i++)
            {
                m[*i]=m[*i]+b;
                b=b*10;
            }
            f.insert(s[0]);
        }
        vector<pair<char,long long> >v(m.begin(),m.end());
        sort(v.begin(),v.end(),cmp);
        int i=v.size()-1;
        //所有字母出现时,找到没有出现在首字母中权重最小的字母
        while(v.size()==10&&i>=0&&f.find((v[i].first))!=f.end())
            i--;
        unsigned long long res=0;
        if(i!=(v.size()-1))
        {
            //最小字母赋值0,删除即可
            v.erase(v.begin()+i);
        }
        int b=9;
        for(int i=0;i<v.size();i++)
        {
            res+=b*v[i].second;
            b--;
        }
        cout<<res<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值