题目
题目链接: https://pintia.cn/problem-sets/994805342720868352/problems/1071785190929788928
题目大意: 这是一道排序题, 考察内容包括sort函数的使用和自定义compare函数的写法. 题目不难, 注意输出格式, 以及要求稍微有些繁琐.
代码
(待重构)
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
map<char, int> levels;
struct node {
char card[15];
int score;
int site;
};
struct sitedata {
int site;
int cnt;
}sites[1000];
int stoint(char *s, int k) {
char* p = s;
int sum = 0;
while (k--) {
sum = sum * 10 +(*p - '0');
p++;
}
return sum;
}
vector<node> list;
bool cmp_level(node &n1, node &n2) {
if (levels[n1.card[0]] != levels[n2.card[0]]) return levels[n1.card[0]]> levels[n2.card[0]];
if (n1.score != n2.score) return n1.score > n2.score;
return strcmp(n1.card, n2.card) < 0;
}
bool cmp_sites(sitedata &s1, sitedata &s2) {
if (s1.cnt != s2.cnt) return s1.cnt > s2.cnt;
return s1.site < s2.site;
}
void typeone(char level) {
bool flag = false;
sort(list.begin(), list.end(), cmp_level);
for (auto p = list.begin(); p != list.end(); p++) {
if (p->card[0] == level) {
printf("%s %d\n", p->card, p->score);
flag = true;
}
else if (flag) break;
}
if (!flag) printf("NA\n");
}
void typetwo(int site) {
int nt = 0, ns = 0;
for (auto p = list.begin(); p != list.end(); p++) {
if (p->site == site) {
nt++;ns += p->score;
}
}
if (nt)
printf("%d %d\n", nt, ns);
else printf("NA\n");
}
void typethree(char date[]) {
int cnt_total = 0;
int day = stoint(date, 6);
for (int i = 0; i < 1000; i++) {
sites[i].cnt = 0;
sites[i].site = i;
}
for (int i = 0; i < list.size(); i++) {
int d = stoint(&(list[i].card[4]), 6);
if (d == day) {
sites[list[i].site].cnt++;
cnt_total++;
}
}
if (!cnt_total) printf("NA\n");
else {
sort(sites, sites+1000, cmp_sites);
int i = 0;
while(sites[i].cnt != 0) {
printf("%d %d\n", sites[i].site, sites[i].cnt);
i++;
}
}
}
int main() {
levels['T'] = 1;
levels['A'] = 2;
levels['B'] = 3;
int n, m;
node temp;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) {
scanf("%s %d", temp.card, &temp.score);
temp.site = stoint(temp.card + 1, 3);
list.push_back(temp);
}
int type;
for (int i = 1; i <= m; i++) {
scanf("%d", &type);
printf("Case %d: %d", i, type);
switch(type) {
case 1:
char level;
getchar();
scanf("%c", &level);
printf(" %c\n", level);
typeone(level);
break;
case 2:
int site1;
scanf("%d", &site1);
printf(" %d\n", site1);
typetwo(site1);
break;
case 3:
char date[7];
scanf("%s", date);
printf(" %s\n", date);
typethree(date);
break;
}
}
system("pause;");
return 0;
}
/*
8 4
B123180908127 99
B102180908003 86
A112180318002 98
T107150310127 62
A107180908108 100
T123180908010 78
B112160918035 88
A107180908021 98
1 A
2 107
3 180908
2 999
*/