STL中map和priority_queue的应用

24 篇文章 0 订阅

基本的知识就不再讲了,只列下用map做的题目:

题1:POJ 1002(487-3279),这个题目烦的死,TLE了n次,只是因为我用G++提交的,好啦,要注意的就是把数组开大点,和用c语言输入,最后如果没有重复的电话号码输出:No duplicates.。

#include<iostream>
#include<cstring>
#include<map>
#include<string>
#include<cstdio>
#include<algorithm>
using namespace std;
char Change(char c)
{   if(c=='A'||c=='B'||c=='C') return '2';
    if(c=='D'||c=='E'||c=='F') return '3';
    if(c=='G'||c=='H'||c=='I') return '4';
    if(c=='J'||c=='K'||c=='L') return '5';
    if(c=='M'||c=='N'||c=='O') return '6';
    if(c=='P'||c=='R'||c=='S') return '7';
    if(c=='T'||c=='U'||c=='V') return '8';
    if(c=='W'||c=='X'||c=='Y') return '9';  
    return c;
}
int main()
{   map<string,int> m;
    int n;
    char s[50];
    scanf("%d",&n);
    getchar();
    for(int i=0;i<n;i++)
    {   gets(s);
        string temp="";
        int sum=0;
        for(int j=0;j<strlen(s);j++)
        {   if(s[j]!='-')
            {   temp+=Change(s[j]);
                sum++;
            }
            if(sum==7) break;
        }
        string::iterator it=temp.begin();
        temp.insert(it+3,'-');
        m[temp]++;
    }
    int flag=0;
    map<string,int>::iterator it; 
    for(it=m.begin();it!=m.end();it++)
        if((*it).second>1) 
        {   cout<<(*it).first<<" "<<(*it).second<<endl;
            flag++;
        } 
    if(!flag) cout<<"No duplicates. "<<endl;    
    return 0;
}

要注意就是map<key,value>排序是默认的是以key来排序的,不能根据value来排序,当然可以借助pair来对value进行排序。

 l例NYOJ 95(众数问题),直接贴标准代码了:

#include<iostream>
#include<map>
#include<algorithm> 
using namespace std;
bool mysort(const pair<int,int>& p1,const pair<int,int>& p2)
{   return p1.second<p2.second;
}
int main()
{   int n,value,Case;
    cin>>Case;
    while(Case--)
    {   cin>>n;
        map<int,int> m;
        for(int i=0;i<n;i++)
        {   cin>>value;
            m[value]++;
        }
        map<int,int>::iterator it=max_element(m.begin(),m.end(),mysort);
        cout<<(*it).first<<" "<<(*it).second<<endl; 
    }
    return 0;
}

HDU涉及到map的题目有:1004(√),1075(√),1113(√)(题目意思是:XXXXXX前面是一个字典序,判断XXXXXX中的字符串能否由前面的字符串得出(可以交换顺序),并输出所有满足的字符串),直接排序后用map映射即可。贴下代码把,虽然很简单:

#include<iostream>
#include<map>
#include<string>
#include<algorithm>
using namespace std;
map<string,string> m;
int main()
{   string s;
    while(cin>>s)
    {   if(s=="XXXXXX") break;
        string temp=s;
        sort(s.begin(),s.end());
        m[temp]=s;
    }
    while(cin>>s)
    {   if(s=="XXXXXX") break;
        sort(s.begin(),s.end());
        map<string,string>::iterator it;
        int flag=0;
        for(it=m.begin();it!=m.end();it++)
            if((*it).second==s)
            {   cout<<(*it).first<<endl; 
                flag=1;
            }
        if(!flag) cout<<"NOT A VALID WORD"<<endl;     
        cout<<"******"<<endl;     
    }
    return 0;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值