codeforces里面的一道模拟题,题目逻辑还算清晰,唯一需要注意的地方是输出人名字的时候的优先因子要求是与自己有关系的。
原题在这里B. Facetook Priority Wall,参考了别人的代码主要是如何实现带空格的读入:http://blog.csdn.net/leolin_/article/details/6372756
先亮代码,然后总结,代码如下:
#include<iostream>
#include<string>
#include<algorithm>
#include<map>
using namespace std;
string s, t;
map<string, int> msi;
struct node
{
string str;
int v;
}p[105];
void priorityScore(string st)
{
int len = st.length();
int i;
string a, b;
a.clear(), b.clear();
for (i = 0; i < len; ++i)
{
if (st[i] == ' ')
break;
a += st[i];
}
i++;
int v;
if (st[i] == 'p')
{
v = 15;
for (i =i+ 10; i < len; ++i)
{
if (st[i] == '\'')//先转义一下才能识别'
break;
b += st[i];
}
}
if (st[i] == 'c')
{
v = 10;
for (i=i + 13; i < len; ++i)
{
if (st[i] == '\'')//先转义一下才能识别'
break;
b += st[i];
}
}
if (st[i] == 'l')
{
v = 5;
for (i=i + 6; i < len; ++i)
{
if (st[i] == '\'')//先转义一下才能识别'
break;
b += st[i];
}
}
if (a == s || b == s)//不包括自己的名字
{
if (b == s)
msi[a] += v;
if (a == s)
msi[b] += v;
}
if (a != s&&b != s)
{
if (msi.find(a) == msi.end())
msi[a] = 0;
if (msi.find(b) == msi.end())
msi[b] = 0;
}
}
bool cmp(node a, node b)
{
if (a.v == b.v)
return a.str < b.str;
return a.v > b.v;
}
int main()
{
int n, i;
cin >> s >> n;
getchar();
for (i = 0; i < n; ++i)
{
getline(cin, t);
priorityScore(t);
}
map<string, int>::iterator it;
int cnt = 0;
for (it = msi.begin(); it != msi.end(); ++it)
{
p[cnt].str = it->first;
p[cnt].v = it->second;
cnt++;
}
sort(p, p + cnt, cmp);
for (int i = 0; i < cnt; ++i)
cout << p[i].str << endl;
return 0;
}
题目并不难,逻辑也很清晰,代码也好懂,唯一的问题是我的编程能力太菜了,有想法却不知道该怎么实现,所以才记录一下别人的代码,取人之长,补己之短,总结如下:
1.如何输入带空格的字符串呢?例如读入ahmed posted on li's wall这么一句话,我是希望一并输入的,但是可能要求是可以在这一个长的字符串里再分别处理其中的每个字串,这时候可以借助两行代码实现:先用一个getchar,然后再用getline(cin,t);//t为输入的带空格的长字符串,一会我再总结一下getchar和getline的用法;
2.map根据值排序其实是很容易实现的,写一个比较函数借助algorithm里面的sort函数就能实现.当然这个过程不能在map里实现,需要借助结构体把map里面的元素放到结构体里然后实现排序遍历等操作。