vector的小小应用,大大功能
Sample Input
16
TEAM1 1 A Y
TEAM2 2 A N
TEAM2 3 A Y
Dream 4 A Y
TEAM3 5 A Y
TEAM3 6 B Y
TEAM4 7 A Y
TEAM4 8 B Y
TEAM4 9 C Y
Dream 10 B Y
Dream 11 C Y
TEAM3 12 C Y
TEAM1 13 B Y
TEAM1 14 C Y
TEAM1 15 D Y
Dream 16 D Y
2
Dream
TEAM1
Sample Output
time:4 rank:2
time:6 rank:3
time:8 rank:4
time:10 rank:3
time:11 rank:2
time:12 rank:3
time:15 rank:4
time:16 rank:1
time:1 rank:1
time:6 rank:2
time:8 rank:3
time:10 rank:4
time:15 rank:1
time:16 rank:2
Dream
TEAM1
TEAM3
TEAM4
TEAM2
没有用vector的做法,采用的是另外的两个二维数组
一个用来记时间,一个用来记排名。此外,还用了一个一
维数组,来统计有多少次改动。
然而,所有这些,用一个vector就可以搞定了。
先贴出没有用vector的代码。
#include "iostream"
#include "cstring"
#include "algorithm"
#include "string"
#include "map"
using namespace std;
#define sz 21
#define ca 201
int tm[sz][ca], rk[sz][ca], wg[sz][ca];
bool AC[sz][ca];
struct submit
{
string na;
int ti;
char pr, sb;
}s[ca];
struct team
{
string na;
int an, at, ra;
}t[sz], tt[sz];
bool check(team a, team b)
{
if(a.an > b.an) return true;
if(a.an==b.an && a.at<b.at) return true;
if(a.an==b.an && a.at==b.at && a.na<b.na) return true;
return false;
}
int main()
{
int n, k1 = 0, k2 = 0, flag1, flag2, df[sz], who, whi, nowtime;
string ne;
map<string, int> nm; //name
map<char, int> pm; //probelm
for(int i=0; i<21; i++)
{
t[i].an = 0; t[i].at = 0;
t[i].ra = 0; df[i] = 0;
}
memset(tm, 0, sizeof(tm)); memset(rk, 0, sizeof(rk));
memset(wg, 0, sizeof(wg)); memset(AC, false, sizeof(AC));
cin>>n;
for(int i=0; i<n; i++)
{
flag1 = 1; flag2=1;
cin>>s[i].na>>s[i].ti>>s[i].pr>>s[i].sb;
nowtime = s[i].ti;
for(int j=0; j<i; j++)
{
if(s[i].na==s[j].na) flag1=0;
if(s[i].pr==s[j].pr) flag2=0;
}
if(flag1)
{
t[k1].na = s[i].na; //存入姓名
nm[s[i].na]=k1; k1++;
}
if(flag2)
{
pm[s[i].pr]=k2;
k2++;
}
who = nm[s[i].na]; whi = pm[s[i].pr];
if(s[i].sb=='N') wg[who][whi]++;
else if(AC[who][whi]==false)
{
AC[who][whi]=true;
t[who].an++;
t[who].at+=(nowtime+20*wg[who][whi]);
}
for(int i=0; i<k1; i++)
tt[i] = t[i];
sort(tt, tt+k1, check);
for(int j=0; j<k1; j++)
{
who = nm[tt[j].na];
if(t[who].ra!=(j+1)) //j+1是现在的排名
{
t[who].ra = j+1; df[who]++;
tm[who][df[who]]=nowtime; //记录提交时的时间
rk[who][df[who]]=j+1;
}
}
}
cin>>n;
while(n--)
{
cin>>ne;
for(int i=1; i<=df[nm[ne]]; i++)
cout<<"time:"<<tm[nm[ne]][i]<<" rank:"<<rk[nm[ne]][i]<<endl;
cout<<endl;
}
for(int i=0; i<k1; i++)
cout<<tt[i].na<<endl;
}
下面给出用了vector的代码。
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct Info
{
int iTime;
int iRank;
};
struct Team
{
int Problems[36]; //小于0表示已经AC,大于0表示WA次数,等于0表示还没提交
int AcCount;
int total_time;
string name;
int rank;
vector<Info> curve; //将结构体Info放入vector中,这个用法比较新
};
bool Cmp(Team t1,Team t2)
{
if(t1.AcCount > t2.AcCount)return true;
if(t1.AcCount < t2.AcCount)return false;
if(t1.total_time < t2.total_time)return true;
if(t1.total_time > t2.total_time)return false;
return t1.name < t2.name;
}
int N,M;
Team Teams[20];
int Team_Count = 0;
int GetID(string str) //将字符串映射到数字,便于用计算机处理,其实可以用map来实现
{
int i;
for(i=0;i<Team_Count;i++)
if(str == Teams[i].name) return i;//已经存在了,就返回他的number
Teams[Team_Count].name = str; //不存在,加入Teams中
Team_Count++;
return Team_Count-1;
}
void Init()
{
int i,j;
for(i=0;i<20;i++)
{
for(j=0;j<36;j++)
Teams[i].Problems[j] = 0;
Teams[i].AcCount = 0;
Teams[i].name = "";
Teams[i].rank = 21;
Teams[i].total_time = 0;
}
}
int main()
{
Init();
int i,j, NID, PID;
string teamName;
char results,ProblemID;
int SubTime;
cin>>N;
for(i=1;i<=N;i++)
{
cin>>teamName>>SubTime>>ProblemID>>results;
NID = GetID(teamName); PID = ProblemID-'A';
if( Teams[NID].Problems[PID] < 0 )continue; //忽略已经AC的题目
if(results == 'Y')
{
Teams[NID].total_time += (SubTime+20*Teams[NID].Problems[PID]);
Teams[NID].Problems[PID] = -1;
Teams[NID].AcCount++;
}
else
Teams[NID].Problems[PID]++;
sort(Teams,Teams+Team_Count,Cmp);
for(j=0;j<Team_Count;j++)
{
if(Teams[j].rank != j)
{
Info TMP;
TMP.iRank = 1+j;
TMP.iTime = SubTime;
Teams[j].rank = j;
Teams[j].curve.push_back(TMP); //将变化的排名存入Teams[j]的vector中
}
}
}
cin>>M;
while(M--)
{
cin>>teamName;
int xb = GetID(teamName);
for(i=0;i<Teams[xb].curve.size();i++)
cout<<"time:"<<Teams[xb].curve[i].iTime<<" rank:"<<Teams[xb].curve[i].iRank<<endl;
cout<<endl;
}
for(i=0;i<Team_Count;i++)
cout<<Teams[i].name<<endl;
}
总结:
在一个结构体中放入一个vector来可以统计结构体
以外的内容,省去了用多个数组才能实现的麻烦。
posted on 2011-11-23 13:14 More study needed. 阅读(262) 评论(0) 编辑 收藏 举报