首页 > 其他分享 >模拟

模拟

时间:2025-01-19 16:10:35浏览次数:1  
标签:++ 赛场 int 监考 nowx res 模拟

天梯赛使用 OMS 监考系统,需要将参赛队员安排到系统中的虚拟赛场里,并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们,以便发放比赛账号。为了尽可能减少教练和监考的沟通负担,我们要求赛场的安排满足以下条件:

每位监考老师负责的赛场里,队员人数不得超过赛场规定容量 C;
每位教练需要联系的监考人数尽可能少 —— 这里假设每所参赛学校只有一位负责联系的教练,且每个赛场的监考老师都不相同。
为此我们设计了多轮次排座算法,按照尚未安排赛场的队员人数从大到小的顺序,每一轮对当前未安排的人数最多的学校进行处理。记当前待处理的学校未安排人数为 n:

如果 n≥C,则新开一个赛场,将 C 位队员安排进去。剩下的人继续按人数规模排队,等待下一轮处理;
如果 n<C,则寻找剩余空位数大于等于 n 的编号最小的赛场,将队员安排进去;
如果 n<C,且找不到任何非空的、剩余空位数大于等于 n 的赛场了,则新开一个赛场,将队员安排进去。
由于近年来天梯赛的参赛人数快速增长,2023年超过了 480 所学校 1.6 万人,所以我们必须写个程序来处理赛场安排问题。

输入格式:
输入第一行给出两个正整数 N 和 C,分别为参赛学校数量和每个赛场的规定容量,其中 0<N≤5000,10≤C≤50。随后 N 行,每行给出一个学校的缩写(为长度不超过 6 的非空小写英文字母串)和该校参赛人数(不超过 500 的正整数),其间以空格分隔。题目保证每所学校只有一条记录。

输出格式:
按照输入的顺序,对每一所参赛高校,在一行中输出学校缩写和该校需要联系的监考人数,其间以 1 空格分隔。
最后在一行中输出系统中应该开设多少个赛场。

输入样例:
10 30
zju 30
hdu 93
pku 39
hbu 42
sjtu 21
abdu 10
xjtu 36
nnu 15
hnu 168
hsnu 20
输出样例:
zju 1
hdu 4
pku 2
hbu 2
sjtu 1
abdu 1
xjtu 2
nnu 1
hnu 6
hsnu 1
16

#include<bits/stdc++.h>
#define lc p<<1
#define rc p<<1|1
#define INF 2e9
using namespace std;
#define lowbit(x) x&(-x)
#define endl '\n'
using ll = long long;
using pii = pair<int,string>;
const double PI = acos(-1);
const int N=5e3+10;
string str[N];
void solve(){
	int n,C;cin>>n>>C;
	map<string,int> ans;
	priority_queue<pii,vector<pii>,less<pii>> q;
	vector<int> res;
	for(int i=1;i<=n;i++){
		string s;int x;cin>>s>>x;
		q.push({x,s});
		str[i]=s;
	}
	int cnt=0;
	while(!q.empty()&&q.top().first!=0){
		int nowx=q.top().first;
		string nows=q.top().second;
		if(nowx>=C){
			cnt++;
			ans[nows]++;
			q.pop();
			nowx-=C;
			q.push({nowx,nows});
		}
		else{
			
			if(!res.empty()){
				bool flag=0;
				for(int i=0;i<res.size();i++){
					if(res[i]>=nowx){
						flag=1;
						q.pop();
						ans[nows]++;
						res[i]=res[i]-nowx;
						break;
					}
				}
				if(!flag){
					cnt++;
					ans[nows]++;
					q.pop();
					res.push_back(C-nowx);
				}
			}
			else{
				cnt++;
				ans[nows]++;
				q.pop();
				res.push_back(C-nowx);
			}
			
		}
		
	}
	for(int i=1;i<=n;i++)
		cout<<str[i]<<" "<<ans[str[i]]<<endl;
	cout<<cnt;
}


int main() {
//	ios::sync_with_stdio(false);
//	cin.tie(nullptr), cout.tie(nullptr);
	
	int T = 1;
//	cin>>T;
	while (T--) {
		solve();
	}
	
	return 0;
}



标签:++,赛场,int,监考,nowx,res,模拟
From: https://www.cnblogs.com/laileou/p/18679650

相关文章

  • Powersim系统整体决策模拟工具-系统动力学
    Powersim系统整体决策模拟工具-系统动力学Powersim软件是由挪威PowersimSoftwareAS研发的一款高性能系统决策和分析软件,旨在通过构建复杂业务系统的系统动力学模型进行问题挖掘和获得基于数据和分析技术的商业洞见。Powersim和Vensim,Stella并列成为系统动力学仿真软件行业的......
  • 1.17 CW 模拟赛 T2. 艺术家
    前言更重要的是研究这题的部分分,赛时居然可以做到\(1\\rm{h}\)没有拿到任何一个特殊性质发现以前一直用的大标题很碍眼,改了,下课把之前的格式也改一下思路暴力容易模拟,做到\(25\%\)特殊性质\(\rm{A}\)思路你发现每一个区间都是其后面区间的前缀,而且每次长......
  • 【Python】Selenium根据网页页面长度,模拟向下滚动鼠标,直到网页底部的操作
    最近在弄selenium的爬取的过程中,我发现一些网站上的表格,是需要手动拉到底部才能加载完成的。如果没有拉到底部,那么在获取网页表格的时候,表格就会只有显示的一部分,页面就不完整。所以我就整理了一些模拟滚动鼠标,加载到页面底部的方法。用于处理这个问题~以下是几种常见的......
  • 【无人机】模拟一群配备向下摄像头的移动空中代理覆盖平面区域(Matlab代码实现)
     ......
  • 2025省选模拟6
    2025省选模拟6T1、圣诞树原cf140E先说60pts做法:首先考虑如何处理两层之间的转移。每两层之间我们只需要用总方案数减去两层重合的方案数即可,对于两层重合的方案数,我们其实并不需要知道具体集合是什么,只需要知道集合的大小,然后乘上一个组合数即可,所以我们需要知道不考虑......
  • 2025 省选模拟 6
    2025省选模拟6A.圣诞树DP,计数题考虑题目题目的两个限制相邻两层彩球颜色集合不同同层相邻两个彩球颜色不同发现求出每一行恰好\(j\)个颜色后第二个限制很简单就解决了。设\(f_{i,j}\)表示长度为\(i\)时恰好有\(j\)个颜色的方案数(对于一行考虑)设\(g_{i,j}......
  • 在kubernates中安装安卓模拟器
    1.检测环境root@xx:~#aptinstallcpu-checkerroot@xx:~#kvm-okINFO:/dev/kvmexistsKVMaccelerationcanbeusedroot@xx:~#ll/dev/kvmcrw-rw----1rootkvm10,232Jan1516:38/dev/kvm确认/dev/kvm设备存在即可。如果是ESXi虚拟机服务器,则需要在虚拟机配置......
  • 【教程4>第5章>第11节】QPSK调制与相位偏差模拟FPGA实现
    本课程学习成果预览 欢迎订阅FPGA/MATLAB/Simulink系列教程《★教程1:matlab入门100例》《★教程2:fpga入门100例》《★教程3:simulink入门60例》《★教程4:FPGA/MATLAB/Simulink联合开发入门与进阶X例》目录1.软件版本2.QPSK调制理论简介3.QPSK调制与相位偏差模拟......
  • 【LeetCode 刷题】数组-模拟-螺旋矩阵
    此博客为《代码随想录》数组章节的学习笔记,主要内容为数组模拟的相关题目解析。文章目录59.螺旋矩阵II54.螺旋矩阵59.螺旋矩阵II题目链接classSolution:defgenerateMatrix(self,n:int)->List[List[int]]:l,r,t,b=0,n-1,0,n-......
  • 55. 右旋字符串(第八期模拟笔试)
    题目自己写的:#include<iostream>#include<string>#include<algorithm>usingnamespacestd;intmain(){intn;strings;cin>>n>>s;reverse(s.begin(),s.end());reverse(s.begin(),s.begin()+n);r......