您的位置:首页 > 运维架构

(map+struct)GYM_100443 Trending Topic

2017-08-15 07:54 155 查看

GYM_100443

 Trending Topic

题意

每一天给出一些单词,对于每次询问,输出7天内出现次数最多的N个词(当最后一个单词出现次数一致的时候,可以>=N)

解决

方案1:

这个题在怎么排序上面纠结…

1. 用map保存最近七天单词出现的次数

2. 同样用set保存七天内单词出现的次数,类型为
pair<int,string>
,优先第一关键字升序排序,我们想拿到降序,把出现的次数变成负的扔进去就好了.

pair类型

1. 本身是一个结构体,优先第一关键字升序排序

2.
make_pair()
无需写出型别,就可以生成一个pair对象.比如我们不用写pair

#define mp make_pair
#define rep(i,a,b) for(int i=a;i<(b);++i)

vector<string> day[maxn];
map<string,int> map7;                           //map建立str到int的映射
set<pair<int,string> > set7;                    //set实现排序

int main()
{
//freopen("data.txt","r",stdin);
int days=0;
string str;
while(cin>>str)
{
if(str=="<text>"){days++;continue;}
if(str=="</text>")
{
if(days>7)
{
rep(i,0,sz(day[days-7])){
string &s=day[days-7][i];
int cnt=map7[s];
map7[s]--;
set7.erase(set7.find(mp(-cnt,s)));  //注意set的erase方法参数是迭代器,而find函数返回值也是一个迭代器

4000
set7.insert(mp(-(cnt-1),s));
}
day[days-7].clear();                    //清空7天前的数据防止爆内存
}
continue;
}
if(str=="<top")
{
int n,cnt=0,last=1e9;
cin>>n;
printf("<top %d>\n",n);
set<pair<int,string> >::iterator it;        //it迭代器不能进行加减操作...
for(it=set7.begin();it!=set7.end();it++)
{
if(it->first==0) break;
if(it->first!=last&&cnt>=n) break;
cout<< it->second <<' '<< -(it->first) <<endl;
cnt++;
last=it->first;
}
puts("</top>");
continue;

}
if(str.size()<4) continue;
day[days].push_back(str);
if(map7.count(str))
{
int cnt=map7[str];
set7.erase(set7.find(mp(-cnt,str)));
set7.insert(mp(-(cnt+1),str));
map7[str]++;
}
else
{
map7[str]=1;
set7.insert(mp(-1,str));                        //把负数扔进去是为了按照绝对值降序,最后拿到最大值
}
}
return 0;
}


方案2:

struct node
{
int num;
string str;
node(){}
node(int n,string s){num=n;str=s;}
bool operator<(const node &n2)const
{
if(num==n2.num) return str<n2.str;
return num>n2.num;
}
};
vector<string> day[maxn];
map<string,int> map7;                           //map建立str到int的映射
set<node> set7;                                 //set实现排序

int main()
{
//freopen("data.txt","r",stdin);
int days=0;
string str;
while(cin>>str)
{
if(str=="<text>"){days++;continue;}
if(str=="</text>")
{
if(days>7)
{
rep(i,0,sz(day[days-7])){
string &s=day[days-7][i];
int cnt=map7[s];
map7[s]--;
set7.erase(node(cnt,s));            //注意set的erase方法参数是迭代器,而find函数返回值也是一个迭代器
set7.insert(node(cnt-1,s));
}
day[days-7].clear();                    //清空7天前的数据防止爆内存
}
continue;
}
if(str=="<top")
{
int n,cnt=0,last=1e9;
cin>>n;
printf("<top %d>\n",n);
set<node>::iterator it;                     //it迭代器不能进行加减操作...
for(it=set7.begin();it!=set7.end();it++)
{
if(it->num==0) break;
if(it->num!=last&&cnt>=n) break;
cout<< it->str <<' '<< it->num <<endl;
cnt++;
last=it->num;
}
puts("</top>");
continue;

}
if(str.size()<4) continue;
day[days].push_back(str);
if(map7.count(str))
{
int cnt=map7[str];
set7.erase(set7.find(node(cnt,str)));
set7.insert(node(cnt+1,str));
map7[str]++;
}
else
{
map7[str]=1;
set7.insert(node(1,str));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct