L2-046 天梯赛的赛场安排 #二次手写cmp比较函数 这个模拟思路太神了
文章目录
- 题目解读
- 思路
- AC CODE
- 参考
题目解读
巴拉巴拉一大堆,实际上题目都告诉我们用什么算法能得到最优解了
但是模拟的过程还是十分的艰辛
思路
大模拟,注释给出
AC CODE
#include<bits/stdc++.h>
using namespace std;
const int N =5010;
int totalSum;
struct range{
string name;
int id;
int num;//教室数量
int stuNum;//学生数量
}r[N];
vector<int> class_;//额外开辟的考场
bool cmp1(range r1,range r2){
return r1.stuNum>r2.stuNum;
}
bool cmp2(range r1,range r2){
return r1.id < r2.id;
}
int main(){
int n,c;
cin >> n >> c;
for(int i=0; i<n; i++){
string name;
int num;
cin >> name >> num;
//教室数量
int t=num/c;
//纯赛场数量
totalSum+=t;
//剩几个学生
num%=c;
//有剩余的话后续还要额外给他加学生
if(num!=0)t++;
r[i]={name,i,t,num};
}
//按照剩余学生数量进行排序
sort(r,r+n,cmp1);
for(int i=0; i<n; i++){
bool flag=false;
//当前学校学生安排完毕就continue
if(r[i].stuNum==0)continue;
else{
for(int j=0; j<class_.size(); j++){
//当前学生能被安排到这个赛场
if(class_[j]+r[i].stuNum<=c){
flag=true;
break;
}
}
//不能的话新开辟,初始值就是当前学校的学生人数
if(!flag){
class_.push_back(r[i].stuNum);
}
}
}
sort(r,r+n,cmp2);
for(int i=0; i<n; i++)cout<<r[i].name<<" "<<r[i].num<<endl;
cout<<totalSum+class_.size();
return 0;
}
参考
B站up主,一天五顿饭
🌻编写本篇文章目的是笔者想以输出的形式进行学习,顺便记录学习点滴🌻
🌹 如果本篇文章对你有帮助的话那就点个赞吧👍🌹
😇 本篇文章可能存在多处不足,如有修改意见,可以私信或者评论我哦 😇