Acwing最惨ac数, PAT上ac所有测试点, 但acwing只ac了6个
惨不忍睹
原因:
我的输出里面有一部分数据,实际分数是一样,但是排名却不一样
左侧我的输出, 右侧acwing
最后再排序加上 1e-8就全部AC了
前面贪图快导致的, 应该先将所有数据遍历一遍,取整,这样就非常方便操作了
#include <iostream>
#include <cstring>
#include <vector>
#include <unordered_map>
#include <algorithm>
using namespace std;
const int N = 100010;
unordered_map<string, int> pos;
double s[N];
int p[N];
bool cmp(const string& s1, const string& s2)
{
int i1 = pos[s1];
int i2 = pos[s2];
int c1 = s[i1];
int c2 = s[i2];
return c1 != c2 ? c1 > c2 : p[i1] != p[i2] ? p[i1] < p[i2] : s1 < s2;
}
void calc(string a, int id, double score)
{
if (a[0] == 'T')
{
s[id] += score * 1.5;
}else if (a[0] == 'B')
{
s[id] += score / 1.5;
}else s[id] += score;
}
int main()
{
int m, r;
cin >> m;
vector<string> res;
for(int k = 1; k <= m ; k ++)
{
string a, c;
// 但凡要加,则用double
double b;
cin >> a >> b >> c;
// c小写
//c = _tolower(c);
for(int i = 0; i < c.size(); i++)
{
if (c[i] >= 'A' && c[i] <= 'Z') c[i] = (char) c[i] -'A'+'a';
}
// 是否访问
if (!pos[c])
{
pos[c] = k;
res.push_back(c);
}
int id = pos[c];
p[id]++;
calc(a, id, b);
}
sort(res.begin(), res.end(), cmp);
int rank = 1;
printf("%d\n", res.size());
printf("%d %s %d %d\n", rank, res[0].c_str(), (int)s[pos[res[0]]], p[pos[res[0]]]);
int cnt = 1;
for(int i = 1; i < res.size(); i++) {
cnt++;
int id1 = pos[res[i - 1]];
int id2 = pos[res[i]];
int c1 = s[id1];
int c2 = s[id2];
if (c2 == c1) r = rank;
else r = cnt, rank = r;
printf("%d %s %d %d\n", r, res[i].c_str(), (int)s[id2], p[id2]);
}
}