100506 I 解题报告
最近我在写非人类题目啊...
链接:http://codeforces.com/gym/100506/attachments/download/2760/20142015-ct-s02e06-codeforces-trainings-season-2-episode-6-en.pdf
题意:
给出若干个ACM队的成绩,求排名
特殊规则:
如果罚时都相同,那么考虑最大的X,使得两者可以得分情况不同(做出题目数或者罚时不同)
如果再相同那只好相同了...
解法:没啥好说的,暴力去
代码:
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<sstream>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct team
{
string name;
int ac[15];
int unac[15];
int ac_problems;
int sum_time;
friend bool operator < (const team &a,const team &b)
{
if (a.ac_problems!=b.ac_problems)
{
return a.ac_problems>b.ac_problems;
}
else if (a.sum_time!=b.sum_time)
{
return a.sum_time<b.sum_time;
}
else
{
int i;
int aa=9,bb=9;
int unsolved_a=0;
int unsolved_b=0;
int unget_time_a=0;
int unget_time_b=0;
for (i=300;i>=1;i--)
{
for (;aa>=0;)
{
if (a.ac[aa]>i)
{
unsolved_a++;
unget_time_a+=a.ac[aa];
unget_time_a-=a.unac[aa]*20;
aa--;
}
else
{
break;
}
}
for (;bb>=0;)
{
if (b.ac[bb]>i)
{
unsolved_b++;
unget_time_b+=b.ac[bb];
unget_time_b-=b.unac[bb]*20;
bb--;
}
else
{
break;
}
}
if (unsolved_a!=unsolved_b)
{
return unsolved_a<unsolved_b;
}
else if (unget_time_a!=unget_time_b)
{
return unget_time_a>unget_time_b;
}
}
}
return a.name<b.name;
}
friend bool operator > (const team &a,const team &b)
{
if (a.ac_problems!=b.ac_problems)
{
return a.ac_problems<b.ac_problems;
}
else if (a.sum_time!=b.sum_time)
{
return a.sum_time>b.sum_time;
}
else
{
int i;
int aa=9,bb=9;
int unsolved_a=0;
int unsolved_b=0;
int unget_time_a=0;
int unget_time_b=0;
for (i=300;i>=1;i--)
{
for (;aa>=0;)
{
if (a.ac[aa]>i)
{
unsolved_a++;
unget_time_a+=a.ac[aa];
unget_time_a-=a.unac[aa]*20;
aa--;
}
else
{
break;
}
}
for (;bb>=0;)
{
if (b.ac[bb]>i)
{
unsolved_b++;
unget_time_b+=b.ac[bb];
unget_time_b-=b.unac[bb]*20;
bb--;
}
else
{
break;
}
}
if (unsolved_a!=unsolved_b)
{
return unsolved_a>unsolved_b;
}
else if (unget_time_a!=unget_time_b)
{
return unget_time_a<unget_time_b;
}
}
}
return false;
}
void clear()
{
memset(ac,0,sizeof(ac));
memset(unac,0,sizeof(unac));
ac_problems=0;
name="";
sum_time=0;
}
void calc()
{
int i,j;
for (i=0;i<10;i++)
{
for (j=i;j<10;j++)
{
if (ac[i]>ac[j])
{
swap(ac[i],ac[j]);
swap(unac[i],unac[j]);
}
}
}
}
};
team a[105];
map<string,int> ma;
int main()
{
#ifdef absi2011
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
ios::sync_with_stdio(false);
int t;
cin>>t;
int zu;
for (zu=0;zu<t;zu++)
{
ma.clear();
int n,m;
cin>>n>>m;
int i;
for (i=0;i<n;i++)
{
a[i].clear();
cin>>a[i].name;
ma[a[i].name]=i;
}
for (i=0;i<m;i++)
{
int time;
string name;
cin>>time;
cin>>name;
char prob;
cin>>prob;
string state;
cin>>state;
if (state=="rejected")
{
if (a[ma[name]].ac[prob-'A']>=1) continue;
a[ma[name]].unac[prob-'A']--;
}
else
{
if (a[ma[name]].ac[prob-'A']>=1) continue;
a[ma[name]].sum_time-=20*a[ma[name]].unac[prob-'A'];
a[ma[name]].sum_time+=time;
a[ma[name]].ac[prob-'A']=time;
a[ma[name]].ac_problems++;
}
}
for (i=0;i<n;i++)
{
a[i].calc();
}
sort(a,a+n);
int rank=1;
for (i=0;i<n;i++)
{
if ((i==0)||(a[i]>a[i-1]))
{
rank=i+1;
}
printf("%d %s %d %d\n",rank,a[i].name.c_str(),a[i].ac_problems,a[i].sum_time);
}
}
return 0;
}
评论 (0)