大模拟,其实读懂题就简单了
自己写的第一次提交差两个点没过
看别人的代码和我的思路一样啊
而且我还是第二第三个点没过
迷茫,还没改出来,去吃饭,,
↓26分代码(AC代码就不去复制了,,有好多)
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n,m,k;
struct stu{
int ge,gi;
int avg,rank;
int sch[6];
int yuan;
};
stu num[50000];
int school[110];
vector<int> inschool[110];
bool cmp(stu a, stu b){
if(a.avg == b.avg) {
return a.ge > b.ge;
}
else return a.avg > b.avg;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=0; i<m; i++){
scanf("%d",&school[i]);
}
for(int i=0; i<n; i++){
scanf("%d%d",&num[i].ge, &num[i].gi);
num[i].avg = (num[i].ge + num[i].gi ) / 2;
//num[i].avg = num[i].ge + num[i].gi;
num[i].yuan = i;
for(int j=0; j<k; j++){
scanf("%d",&num[i].sch[j]);
}
}
sort(num,num+n,cmp);
num[0].rank = 1;
for(int i=1; i<n; i++){
if(num[i].avg == num[i-1].avg && num[i].ge == num[i-1].ge) num[i].rank = num[i-1].rank;
else num[i].rank = i+1;
}
//for(int i=0; i<n; i++)
//cout << num[i].avg << " avg " << num[i].rank << " rank " << num[i].yuan << endl;
for(int i=0; i<n; i++){
for(int j=0; j<k; j++){
if(school[num[i].sch[j]] > 0){
school[num[i].sch[j]]--;
inschool[num[i].sch[j]].push_back(num[i].yuan);
break;
}
else {
int t = inschool[num[i].sch[j]].size();
if( num[i].rank == num[inschool[num[i].sch[j]][t-1]].rank){
inschool[num[i].sch[j]].push_back(num[i].yuan);
school[num[i].sch[j]]--;
// cout << num[i].sch[j] << " sch "<< num[i].rank << " ra "<< i << endl;
break;
}
}
}
}
vector<int> :: iterator it;
for(int i=0 ; i<m; i++){
int t = inschool[i].size();
sort(inschool[i].begin(),inschool[i].end());
for(it = inschool[i].begin(); it != inschool[i].end(); it++){
if(it == inschool[i].begin()) printf("%d",*it);
else printf(" %d",*it);
}
printf("\n");
}
return 0;
}
要是考试那天也有这样就好了,,