Stall Reservations(POJ 3190, 贪心)

本文介绍了一个关于牛棚分配的问题,并使用优先队列和贪心算法进行解决。通过对牛的到达时间和离开时间进行排序,利用优先队列来找到最合适的牛棚位置,从而最小化所需的牛棚数量。

题目链接

       我感觉我该去看紫书研究研究STL了,不知道的东西太多了,不会优先队列的话应该是做不了这个题吧,因为既在按开始时间排序之后判断每个cow是否需要新的stall或者说需要用哪个stall的时候需要找之前的cow中B最早的,自己找的话貌似只能用复杂度很高的方法吧,而优先队列插入数据的复杂度为O(lgn),删除数据的复杂度为O(1),这里n的最大值即stall的最大数,而stall的最大值也不会超过N,所以这个算法的复杂度应为O(N*lgN)。

       此题是贪心加优先队列,具体看代码吧。

include<cstdio>
#include<algorithm>
#include<queue>

using namespace std;

const int MAX_N = 50005;

struct cow {
	int num, A, B, stall;
	friend bool operator <(cow b, cow c)
	{
		return b.B>c.B;	
	} 
} a[MAX_N];

int N, stall;

bool cmp(cow b, cow c){
	return b.A < c.A;
}
void ini()
{
	for(int i=0; i<N; i++){
		a[i].num = i;
		scanf("%d%d", &a[i].A, &a[i].B);
	}
	stall = 1;
}
void assign()
{
	priority_queue<cow> que;
	a[0].stall = 1;
	que.push(a[0]);
	for(int i=1; i<N; i++){
		cow temp = que.top();
		if(a[i].A > temp.B){
			que.pop();
			a[i].stall = temp.stall;
		}
		else a[i].stall = ++stall;
		que.push(a[i]);
	}
}
void print()
{
	printf("%d\n", stall);
	int b[MAX_N];
	for(int i=0; i<N; i++){
		b[a[i].num] = a[i].stall;
	}
	for(int i =0; i<N; i++){
		printf("%d\n", b[i]);
	}
}
int main()
{
	while(~scanf("%d", &N)){
		ini();
		sort(a, a+N, cmp);
		assign();
		print();
	}
	return 0;
}


04-03
### RCU Stall 的概念及其处理 RCU(Read-Copy Update)是一种用于多线程环境下的同步机制,在 Linux 内核中被广泛使用。当发生 RCU stall 时,意味着某个 CPU 或者任务长时间处于一种状态,阻止了 RCU grace period 的完成[^1]。 #### RCU Stall 的检测流程 在内核中,`rcu_sched_clock_irq()` 是触发 RCU stall 检测的一个重要函数。它通过调用一系列子函数来确认是否存在 stalled CPUs 并打印相关信息。以下是其主要路径: - `rcu_sched_clock_irq()` 调用了 `rcu_pending()` 来检查是否有未决的 RCU 工作项。 - 如果存在未决工作,则进一步调用 `check_cpu_stall()` 进行更详细的分析。 - 当发现确实存在 stalled CPUs 时,会依次调用 `print_cpu_stall()` 和其他辅助函数(如 `rcu_dump_cpu_stacks()`、`dump_cpu_task()` 等),最终生成堆栈回溯信息以便调试[^2]。 #### 处理策略 针对 RCU stall 的情况,可以通过调整内核参数来进行控制。例如,`sysctl_panic_on_rcu_stall` 参数决定了系统是否应在检测到 RCU stall 后立即崩溃并记录日志。如果该值设置为 true (`1`) ,那么一旦检测到 stall 将直接引发 kernel panic,并显示 “RCU Stall” 错误消息。 另外需要注意的是,尽管上述讨论集中在 RCU stalls 上,但在现代操作系统中有许多类似的性能瓶颈现象可以利用 Pressure Stall Information (PSI) 技术监测。PSI 提供了一种方法用来衡量由于资源竞争而导致的任务延迟程度,并且能够持续一段时间维持活跃状态以减少波动影响[^3]。 对于您提到的关于 ID 级寄存器 rs1 和 rs2 修改选项部分,这似乎涉及到了指令流水线设计中的数据前馈问题以及如何选择合适的数据源作为操作数输入给后续阶段使用的问题[^4]。不过这部分内容与前面所描述的 RCU stall 主题关联不大。 ```c // 示例代码展示如何启用 sysctl_panic_on_rcu_stall 参数 #include <linux/sysctl.h> static struct ctl_table rcu_sysctls[] = { { .procname = "panic_on_rcu_stall", .data = &sysctl_panic_on_rcu_stall, .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = SYSCTL_ZERO, .extra2 = SYSCTL_ONE, }, }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值