(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; }
相关文章推荐
- map和struct的多重嵌套
- map和结构体的简单运用Gym - 100883C
- Hive学习笔记 --- Array, Map, Struct类型使用
- Mapstruct的简单配置使用
- 解决unresolved external symbol "protected: virtual struct AFX_EVENTSINKMAP const * __thiscall 错误。
- hive array、map、struct使用
- struct kobj_map
- MapStruct使用
- map和结构体的简单运用Gym - 100883C
- hive array、map、struct使用
- gym 100430 G【贪心+map瞎搞】
- c++ 一个简单的map,struct小应用
- Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+优先队列】
- linux设备模型的inode,cdev,kobj_map,char_device_struct
- 大数据Spark “蘑菇云”行动第92课:HIVE中的array、map、struct及自定义数据类型案例实战
- hive复合数据类型 array、map、struct使用
- struct作为map的key
- map和结构体的简单运用Gym - 100883C
- hive复杂格式array,map,struct使用
- MapStruct 代替BeanUtil 和ModelMapper