题解:CF75B Facetook Priority Wall

· · 题解

思路

定义一个 map 标记出现的朋友和他对印的优先级因子。
对于每次输入,若 XY 是我,那么就根据题意,增加我和另一个人的优先级因子,若不是,就把 XY 插入 map 中,利用 map 会去重的特性,就可以统计出我的所有朋友和我的优先级因子。
最后,将朋友和朋友对应的优先级因子搬入结构体,根据优先级因子的大小和朋友名字的字典序进行排序后输出。
具体细节看代码吧~~

代码

#include <bits/stdc++.h>
using namespace std;
map < string,int > mp;//定义map 
string x,y,s,t,w;
int n,m;
struct Node{
    string name;
    int p;
}a[1000005];
bool cmp(Node x,Node y){//排序函数 
    if(x.p!=y.p)return x.p>y.p;//先按优先级因子大小排 
    return x.name<y.name;//优先级因子大小相同,按名字字典序排 
}
int point(string s){//根据题意计算优先级因子的增加值 
    if(s=="likes")return 5;
    if(s=="commented")return 10;
    return 15;
}
int main() {
    cin>>s>>n;
    while(n--){
        cin>>x>>t;//X和动词 
        if(t!="likes")cin>>w;//若非likes输入on
        cin>>y>>w;//Y和post
        y.erase(y.size()-2);//删's 
        if(x==s)mp[y]+=point(t);
        else if(y==s)mp[x]+=point(t);
        //是和我交流,增加优先级因子 
        else {
            mp.insert({x,0});
            mp.insert({y,0});
        }
        //不是和我交流,插入名字
    }
    for(auto g:mp){
        a[++m].name=g.first;
        a[m].p=g.second;//搬入结构体 
    }
    sort(a+1,a+m+1,cmp);//排序 
    for(int i=1;i<=m;++i)cout<<a[i].name<<"\n";//输出 
    return 0;
}