list实现的排行榜 针对游戏逻辑

/*#include <iostream>
#include <list>
#include <map>
using namespace std;
#define MaxSortPlayer 100
struct PlayerDamageInfo
{
int playerid;
int damage;
int count;
}m_player[MaxSortPlayer];
list<PlayerDamageInfo> m_list;
map<int,int> SortRank;




bool compare(const PlayerDamageInfo &cur,const PlayerDamageInfo &next)
{
if(cur.damage == next.damage)
{
if(cur.count == next.count)
{
return cur.playerid < next.playerid;
}
else
{
return cur.count < next.count;
}
}
else
{
return cur.damage > next.damage;
}
}
void ReSort()
{
//STL list支持bool 如果用Int返回 会崩溃掉
m_list.sort(compare);
int i = 1;
//清空map
SortRank.clear();
//排序好的list 对 map进行排名
//这个map的排序,可以每次下发给客户端展示具体数据
for( list<PlayerDamageInfo>::iterator it = m_list.begin(); it != m_list.end(); ++it)
{
SortRank.insert(make_pair(it->playerid,i));
}


}
void Sort(PlayerDamageInfo *info)
{
//第一次排序检查双向链表是否为空,为空的话直接插入
if(m_list.size() == 0)
{
m_list.push_back(*info);
//加入这个map的原因便在于 假如说排行榜内有自己的数据,那么通过map去查找定位替换我在map中的数据
SortRank.insert(make_pair(info->playerid,m_list.size()));
//开始排序了
ReSort();
return ;
}

//如果说这次造成的伤害,小于链表的最末尾的伤害,那么边插入到末尾
if(info->damage < m_list.back().damage)
{
if(m_list.size() <=MaxSortPlayer)
{
m_list.push_back(*info);
SortRank.insert(make_pair(info->playerid,m_list.size()));
ReSort();
return ;
}
}


//检查自己是否在排名以内,如果在定位自己的排名位置
int pos = m_list.size();
if(SortRank.find(info->playerid) != SortRank.end())
{
pos = SortRank[info->playerid];
}
else if(info->damage > m_list.back().damage)
{
m_list.push_back(*info);
ReSort();
return ;
}
else
{
return ;
}


pos--;


list<PlayerDamageInfo>::iterator it = m_list.begin();
while(pos > 0)
{
it++;
pos--;
}
it->damage = info->damage;
it->count = info->count;
ReSort();
}
int main()
{
for(int i = 1; i<MaxSortPlayer; i++)
{
m_player[i].playerid = i;
m_player[i].damage = i;
m_player[i].count  = i;
//开始排序了
Sort(&m_player[i]);
}
//展示排序好的链表
for(list<PlayerDamageInfo>::iterator it = m_list.begin(); it != m_list.end(); ++it)
{
cout<<it->playerid<<"\t"<<it->damage<<"\t"<<it->count<<endl;
}
system("pause");
return 0;
}*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ACM/ICPC比赛成绩会按照一定的规则计算各位参赛者的名次并实时显示排行榜,计算规则主要参考解题的数量及罚时,解题数量越多,罚时越少,则排名越高。 解题数量很容易计算,只需考察比赛中标记为“Accepted”的题数即可。罚时计算则相对复杂,对于提交到竞赛系统中的每道题目,系统会给出一个罚时,为从比赛开始到该题提交的代码第一次被“Accepted”的时间。请注意,只是第一次“Accepted”。对于“Accepted”之前的每次提交,都有20分钟的罚时,但如果该题目最终未解出,则不计罚时。 先在有一个比赛的题目通过情况记录,请生成该比赛的排行榜。 示例输入: 2008-04-25 18:00:00 2008-04-25 23:30:00 1000 1001 1002 1003 1004 38 602203621 1002 Accepted 756K 30MS C++ 2008-04-25 18:04:59 37 liheyuan 1002 Wrong_Answer 768K 10MS C++ 2008-04-25 18:28:05 36 ftest 1000 Accepted 888K 10MS C++ 2008-04-25 21:30:32 35 ftest 1000 Accepted 904K 10MS C++ 2008-04-25 21:30:55 34 gaojianwei 1000 Accepted 768K 10MS C 2008-04-25 22:15:58 33 gaojianwei 1001 Wrong_Answer 904K 10MS C 2008-04-25 22:18:01 32 gaojianwei 1004 Accepted 768K 10MS C 2008-04-25 22:24:23 31 lzz 1000 Accepted 904K 10MS C++ 2008-04-25 23:29:27 30 lzz 1001 Wrong_Answer 904K 10MS C++ 2008-04-25 23:30:17 示例输出: Rank Name Solved 1000 1001 1002 1003 1004 Penalty 1 gaojianwei 2 4:15:58 -1 0 0 4:24:23 8:40:21 2 602203621 1 0 0 0:04:59 0 0 0:04:59 3 ftest 1 3:30:32 0 0 0 0 3:30:32 4 lzz 1 5:29:27 0 0 0 0 5:29:27 5 liheyuan 0 0 0 -1 0 0 0:00:00
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值