测试1,2错误
找了两个多小时,发现里面的节点应该用原来的no也就是ap[i].no,而不是i
if (sc[ap[i].zy[j]][0] > 0||(ki[ap[i].zy[j]]!=1&& ap[ap[i].no].rank == ap[sc[ap[ap[i].no].zy[j]][ki[ap[ap[i].no].zy[j]] - 1]].rank))
最终代码:
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
const int maxn = 40010;
int n;
struct appli {
int ge, gi, sum;
int zy[10];
int rank, no;
int flag;
}ap[maxn];
bool cmp(appli a, appli b) {
if (a.sum != b.sum)return a.sum > b.sum;
else return a.ge > b.ge;
}
int main() {
int m, k, sc[110][10000], ki[110];
cin >> n >> m >> k;
for (int i = 0; i < m; i++)
{
ki[i] = 1;
cin >> sc[i][0];
}
for (int i = 0; i < n; i++)
{
cin >> ap[i].ge >> ap[i].gi;
ap[i].sum = ap[i].ge + ap[i].gi;
ap[i].flag = 0; ap[i].no = i;
for (int j = 0; j < k; j++)
{
cin >> ap[i].zy[j];
}
}
sort(ap, ap + n, cmp);
int rank = 1; ap[0].rank = 1;
for (int i = 1; i < n; i++)
{
if (ap[i].sum != ap[i - 1].sum) { ap[i].rank = rank + 1; rank++; }
else if (ap[i].ge != ap[i - 1].ge)
{
ap[i].rank = rank + 1; rank++;
}
else
{
ap[i].rank = ap[i - 1].rank; rank++;
}
}
/*for (int i = 0; i < n; i++)
{
cout << ap[i].rank << ' ' << ap[i].ge << ' ' << ap[i].gi << ' ';
for (int j = 0; j < k; j++)
{
cout << ap[i].zy[j] << ' ';
}cout << endl;
}*/
for (int i = 0; i < n; i++)
{
for (int j = 0; j < k; j++)
{
if (sc[ap[i].zy[j]][0] > 0||(ki[ap[i].zy[j]]!=1&& ap[ap[i].no].rank == ap[sc[ap[ap[i].no].zy[j]][ki[ap[ap[i].no].zy[j]] - 1]].rank))
{
sc[ap[i].zy[j]][0]--;
sc[ap[i].zy[j]][ki[ap[i].zy[j]]++] = ap[i].no;
ap[i].flag = 1;
break;
}
}
}
set<int> st;
for (int i = 0; i < m; i++)
{
for (int j = 1; j < ki[i]; j++)
{
st.insert(sc[i][j]);
}
for (set<int>::iterator it = st.begin(); it != st.end(); it++)
{
cout << *it; ki[i]--;
if (ki[i] != 1)
{
cout << ' ';
}
}
cout << endl;
st.clear();
}
}