专栏文章

题解:CF411B Multi-core Processor

CF411B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miqrjjx3
此快照首次捕获于
2025/12/04 09:34
3 个月前
此快照最后确认于
2025/12/04 09:34
3 个月前
查看原文

CF411B 题目传送门

题目大意

有编号从 11nnnn 个处理器和编号从 11kkkk 个存储单元,一共有 11mmmm 个时间段,第 ii 个处理器会在第 jj 个时间段给存储单元 xijx_{ij} 发送信号,如果 xij=0x_{ij}=0 表示处理器 ii 在第 jj 号时间段没有发送信号。如果有多个处理器在同一时间段给同一存储单元发送信号,则这些处理器和这个存储单元都将会被锁定。被锁定的处理器不能再发送信号,被锁定的单元不能再接收信号。如果未被锁定的处理器向锁定的存储单元发送信号,则该处理器也会被锁定。给定每个处理器在各个时间段发送信号的目标存储单元编号,请你计算出每个处理器被锁定的时间段。如果不会被锁定则返回 00

解决思路

注意数据范围:1n,m,k1001 \leq n,m,k \leq 100,可以直接想到大模拟

代码展示

CPP
#include<bits/stdc++.h>
using namespace std;

const int N = 110;
int n, m, k, a[N][N];
int cnt[N], ans[N];
bool vis[N];

int main()
{	//建议scanf,更快
	scanf("%d%d%d", &n, &m, &k);
	for(int i = 1; i <= n; i++)
		for(int j = 1; j <= m; j++)
			scanf("%d", &a[i][j]); 
	for(int i = 1; i <= m; i++)
	{
		memset(cnt, 0, sizeof(cnt));
		for(int j = 1; j <= n; j++)
		{
			if(ans[j] || !a[j][i] == 0)//处理器被锁定
				continue;			  //或没有发出指令
			if(vis[a[j][i]])
			{
				ans[j] = i;
				continue;
			}//处理器向已锁定的单元发送指令
			cnt[a[j][i]]++;//统计每个单元接收到的指令数
		}
		for(int j = 1; j <= n; j++)
		{
			if(ans[j]) continue;//处理器已锁定,跳过
			if(cnt[a[j][i]] >= 2)
			//有多个处理器同时向某个单元发送指令
			{
				ans[j] = i;
				vis[a[j][i]] = 1;
				//单元和处理器均被锁定
			}
		}		
	}
	for(int i = 1; i <= n; i++)//建议printf,更快
		printf("%d\n", ans[i]);
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...