本文共 1305 字,大约阅读时间需要 4 分钟。
给N个人的成绩,先按成绩排名输出,然后按照给定名字顺序输出对应的排名,和与他成绩相同且名字的字典序小的数量(如果为1则不输出)
#include #include #include #include #include #include #define mem(a, b) memset(a, b, sizeof(a))#define ll long long#define N 100005#define P pair int inf = 0x3f3f3f3f;using namespace std;struct ac{ string name; int s, sum, rank;}a[N];int sum[N];int main(){ // freopen("in.txt", "r", stdin); int n; while (cin >> n, n){ mem(sum, 0); for (int i = 0; i < n; ++i){ cin >> a[i].name >> a[i].s; a[i].sum = 1; sum[a[i].s]++; } // 按照成绩排序 sort(a, a + n, [&](const ac &a, const ac & b){ if (a.s != b.s){ return a.s > b.s; }else { return a.name < b.name; } }); // 输出 for (int i = 0; i < n; ++i){ a[i].rank = i + 1; cout << a[i].name << " " << a[i].s << endl; } // 求每个人的rank(相同成绩并列排名) for (int i = 1; i < n; ++i) { if (a[i].s == a[i - 1].s) { a[i].rank = a[i - 1].rank; } } for (int i = 0; i < n; ++i){ if (sum[a[i].s] >= 2) { for (int j = 0; j < n; ++j){ if (j == i) continue; if (a[j].s == a[i].s && a[j].name < a[i].name) a[i].sum++; } } } int t; cin >> t; for (int i = 0; i < t; ++i) { string temp; cin >> temp; for (int j = 0; j < n; ++j) { if (a[j].name == temp) { if (a[j].sum > 1) cout << a[j].rank << " " << a[j].sum << endl; else cout << a[j].rank << endl; break; } } } } return 0;}
转载地址:http://azprf.baihongyu.com/