思路
- 1.就是排好序然后逐个取出就好了,锻炼自己的码代码的效率就好了,以后做啥事都得提高效率呀!
- 2.因为我这里sort排序后,储存的是i的话,最后输出是要对id进行排序,不方便,所以我就把id也存进去了,后面直接排序输出。
我出错的地方
- 1.这种方式记住
student(int x) :ge(0), gt(0), total(0), id(-1), choice(vector<int>(x, -1)){};
- 2.这种声明方式也最好记住
vector<student> students(n, student(p));
- 3.记得要加const
bool cmp(const student& a,const student &b);
代码
#include <iostream>
#include <vector>
#include <math.h>
#include<algorithm>
using namespace std;
struct student
{
int ge, gt, total, id;
vector<int> choice;
student() :ge(0), gt(0), total(0), id(-1), choice(0){};
student(int x) :ge(0), gt(0), total(0), id(-1), choice(vector<int>(x, -1)){};
};
struct school
{
vector<int> stu,stu_id;
int quota, lastrank;
school() :stu(0), quota(0), lastrank(-1){};
};
bool cmp(const student& a,const student &b)
{
if (a.total > b.total || (a.total == b.total&&a.ge > b.ge))
return true;
else
return false;
}
int main()
{
ios::sync_with_stdio(false);
int n, m, p;
cin >> n>>m>> p;
vector<student> students(n, student(p));
vector<school> schools(m);
for (int i = 0; i < m; i++)
{
cin >> schools[i].quota;
}
for (int i = 0; i < n; i++)
{
cin >> students[i].ge >> students[i].gt;
students[i].total = students[i].ge + students[i].gt;
students[i].id = i;
for (int j = 0; j < p; j++)
{
cin >> students[i].choice[j];
}
}
sort(students.begin(), students.end(), cmp);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < p; j++)
{
int ch = students[i].choice[j];
if (schools[ch].quota>0)
{
schools[ch].stu.push_back(i);
int idd = students[i].id;
schools[ch].stu_id.push_back(idd);
schools[ch].quota--;
break;
}
else if (schools[ch].quota == 0)
{
if (!schools[ch].stu.empty())
{
int num = (int)schools[ch].stu.size()-1;
int last = schools[ch].stu[num];
if (students[last].total == students[i].total&&students[last].ge == students[i].ge)
{
schools[ch].stu.push_back(i);
int idd = students[i].id;
schools[ch].stu_id.push_back(idd);
break;
}
}
}
}
}
for (int i = 0; i < m; i++)
{
int s = schools[i].stu.size();
sort(schools[i].stu_id.begin(), schools[i].stu_id.end());
for (int j = 0; j < s; j++)
{
if (j == 0)
cout << schools[i].stu_id[j];
else
cout << " " << schools[i].stu_id[j];
}
cout << endl;
}
return 0;
}