A1026 Table Tennis (30 分)

这篇博客详细介绍了A1026乒乓球比赛的规则、参赛选手策略以及比赛亮点,深入探讨了比赛中的技巧和战术应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std;
const int inf = (1 << 31) - 10;
const int maxn = 10010;
struct Node{
	int arr, need, start;
	int tag, stat;
}node[maxn];
struct Table{
	int open;
	int useNum, tag;
}table[110];
int N, K, M;
int L = 8 * 3600, R = 21 * 3600;
bool cmp1(Node n1, Node n2){
	return n1.arr < n2.arr;
}
bool cmp2(Node n1, Node n2){
	return n1.start < n2.start;
}
int nextVip(int idx){
	idx++;
	while(idx < N && node[idx].tag == 0)
		idx++;
	return idx;
}
void allcTable(int idx, int no){
	if(table[idx].open <= node[no].arr){
		node[no].start = node[no].arr;
		table[idx].open = node[no].arr + node[no].need;	
	}else{
		node[no].start = table[idx].open;
		table[idx].open += node[no].need;
	}
	node[no].stat = 1;	
	table[idx].useNum++;
}
int main(){	
	scanf("%d", &N);
	int tt, hh, mm, ss, need, tag;
	for(int i = 0; i < N; i++){
		scanf("%d:%d:%d %d %d", &hh, &mm, &ss, &need, &tag);
		tt = hh * 3600 + mm * 60 + ss;
		node[i].arr = tt;
		node[i].need = min(need * 60, 2 * 3600);
		node[i].tag = tag;
		node[i].start = inf;
		node[i].stat = 0;
	}
	sort(node, node + N, cmp1);
	for(int i = 1; i <= K; i++){
		table[i].open = L;
		table[i].useNum = 0;
		table[i].tag = 0;
	}
	scanf("%d %d", &K, &M);
	int x;
	for(int i = 0; i < M; i++){
		scanf("%d", &x);
		table[x].tag = 1;
	}	
	int vipNo = nextVip(-1);
	for(int i = 0; i < N; i++){
		if(node[i].stat == 1) continue;
		if(node[i].arr >= R) break;
		int minOpen = inf, idx = 1; 
		int minVipOpen = inf, v = 0;
		for(int j = 1; j <= K; j++){
			if(minOpen > table[j].open){
				minOpen = table[j].open;
				idx = j;
			}
			if(table[j].tag == 1 && minVipOpen > table[j].open){
				minVipOpen = table[j].open;
				v = j;
			}	
		}
		if(table[idx].open >= R) break;
		if(node[i].tag == 1){
			if(v != 0 && table[v].open <= node[i].arr){
					allcTable(v, i);
			}else{
				allcTable(idx, i);
			}
			vipNo = nextVip(i);	
		}else{
			if(table[idx].tag == 1 && vipNo < N && node[vipNo].arr <= table[idx].open){
				allcTable(idx, vipNo);
				vipNo = nextVip(vipNo);
				i--;				
			}else{
				allcTable(idx, i);
			}		
		}						
	}
	sort(node, node + N, cmp2);
	int arr, st;
	for(int i = 0; i < N; i++){
		if(node[i].stat == 0) continue;
		arr = node[i].arr;
		st = node[i].start;
		printf("%02d:%02d:%02d ", arr/3600, (arr%3600)/60, (arr%3600)%60);
		printf("%02d:%02d:%02d ", st/3600, (st%3600)/60, (st%3600)%60);
		printf("%.0f\n", round((st - arr) / 60.0));
	}
	for(int i = 1; i <= K; i++){
		printf("%d", table[i].useNum);
		if(i < K) putchar(' ');
	}	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值