因为提交不过的缘故,把数组范围改小了,基础用例和自己编的用例都是正常的,以为起码会有30分吧,嗯,没想到0分,有大神心情好给看看啊。
#include<iostream>
#include<map>
using namespace std;
map<int, int> mp[52];
int select[52][999];
void op1(map<int, int> mp[], int t, int k, int s) {
mp[t][k] = s;
}
void op2(map<int, int> mp[], int t, int k) {
mp[t][k] = -1;
}
void op3(map<int, int> mp[], int max, int limit[], int m, int s[][999]) {
while (max > 0) {
int best = 0; int selm = -1; int selid = -1;
int nullnum = 0;
for (int i = 0; i < m; i++) {
if (limit[i] > 0) {
for (int j = 0; j < mp[i].size(); j++)
if (mp[i][j] > best&& select[i][j] != -1) {
best = mp[i][j]; selm = i; selid = j;
}
else if (mp[i][j] == best && mp[i][j] > 0 && i == selm && j < selid) {
best = mp[i][j]; selm = i; selid = j;
}
else if (mp[i][j] == best && mp[i][j] > 0 && i < selm) {
best = mp[i][j]; selm = i; selid = j;
}
}
else {
nullnum++;
}
}
if (nullnum == m) max = -1;
else {
limit[selm]--;
select[selm][selid] = -1;
max--;
best = 0;
}
}
for (int i = 0; i < m; i++) {
int ischeck = 0;
for (int j = 0; j < mp[i].size(); j++) {
if (select[i][j] == -1) {
ischeck = 1;
cout << j << " "; select[i][j] = 0;
}
}
if (ischeck == 0)cout << -1;
cout << endl;
}
}
int main() {
int m, n;
cin >> m >> n;
for (int i = 0; i < n; i++) {
int k, v;
cin >> k >> v;
for (int j = 0; j < m; j++) {
mp[j][k] = v;
}
}
int ops;
cin >> ops;
for (int i = 0; i < ops; i++) {
int opmask;
cin >> opmask;
if (opmask == 1) {
int type, key, score;
cin >> type >> key >> score;
op1(mp, type, key, score);
}
else if (opmask == 2) {
int type, key;
cin >> type >> key;
op2(mp, type, key);
}
else if (opmask == 3) {
int max;
int limit[52];
cin >> max;
for (int q = 0; q < m; q++)cin >> limit[q];
op3(mp, max, limit, m, select);
}
}
return 0;
}