因为这道题在STL的课里,虽然第二遍做但是还是顺着前几道题的思维用map做了,用STL做太麻烦,暂未发现STL的简单方法。
样例过了但答案错50%,不想深究了。
//答案错误50%
#include<bits/stdc++.h>
using namespace std;
const int N = 1e3 + 7;
int score[13];//M道题的分值
string s[N];//存准考证号
map<string, int >mp;
typedef pair<string, int > PAIR;
vector<PAIR > v;//转接mp用来排序
bool cmp_by_value(PAIR a, PAIR b) {
return a.second > b.second;
if (a.second == b.second) {
return a.first < b.first;
}
}
int main(){
int n, M, g;
while (scanf_s("%d", &n) != EOF) {//我还纳闷为啥不一行输入,淦
if (n == 0)break;
scanf_s("%d %d", &M, &g);
for (int i = 1; i <= M; i++) {
scanf_s("%d", &score[i]);
}
mp.clear();
(*s).clear();
for (int i = 1; i <= n; i++) {
cin >> s[i];
int m, cnt;
scanf_s("%d", &m);
for (int j = 0; j < m; j++) {
scanf_s("%d", &cnt);
mp[s[i]] += score[cnt];
}
}
v.clear();
int s_cnt = 0;//过线人数
map<string, int>::iterator it;
for (it = mp.begin(); it != mp.end(); it++) {//卡住
if (it->second >= g) {//选出过线学生存入vector
s_cnt++;
v.push_back(PAIR(it->first, it->second));
}
}
printf("%d\n", s_cnt);
sort(v.begin(), v.end(), cmp_by_value);
vector<PAIR>::iterator vit;
for (vit = v.begin(); vit!=v.end(); vit++) {
cout << vit->first << " " << vit->second << endl;
}
}
return 0;
}
一.vector与pair
- 向vector插入pair时要使用 make_pair()
vector<pair<int,int> >vec;
vec.push_back(make_pair(20,30));
vec.push_back(make_pair<int,int>(10,50));
二.思路波动过程
按照STL思路做下去后,由于题意要求按照分数排序,而map只能按key排序,导致做到最后卡了一下。网上搜索解决方法,即把map中的内容放到pair中,再放入vector,最后自定义比较方法后对vector进行排序。
答案较结构体方法复杂太多,做题时有结构体提示直接硬作就完事了。
- 2020/1/26 结构体
- 2020/2/16 STL