流浪地球

本文解析《流浪地球》中的发动机启动策略,探讨手动与关联启动的交互影响,揭示最后被启动的发动机序列。

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

流浪地球

描述

流浪地球计划在赤道上均匀部署了N个转向发动机,按位置顺序编号为0~N-1。
1) 初始状态下所有的发动机都是未启动状态;
2) 发动机起动的方式分为“手动启动”和“关联启动”两种方式;
3) 如果在时刻1一个发动机被启动,下一个时刻2与之相邻的两个发动机就会被“关联启动”;
4) 如果准备启动某个发动机时,它已经被启动了,则什么都不用做;
5) 发动机0与发动机N-1是相邻;
地球联合政府准备挑选某些发动机在某些时刻进行“手动启动”,当然最终所有的发动机都会被启动。
哪些发动机最晚被启动呢?

输入描述:
第一行两个数字N和E,中间有空格
N代表部署发动机的总个数,E代表计划手动启动的发动机总个数
1<N<=1000,1<=E<=1000,E<=N
接下来共E行,每行都是两个数字T和P,中间有空格
T代表发动机的手动启动时刻,P代表此发动机的位置编号。
0<=T<=N,0<=P<=N

输出描述:
第一行一个数字N,以回车结束
N代表最后被启动的发动机个数
第二行N个数字,中间有空格,以回车结束
每个数字代表发动机的位置编号,从小到大排序

示例:

输入
8 2
0 2
0 6
输出
2
0 4

代码如下:

//检查是否全启动
bool CheckAll(int[] list)
{
	for(int i = 0; i < list.length; i++)
	{
		if(list[i] == 0)
			return false;
	}
	return true;
}

//关联启动
void gettrigger(int index, ref int[] list, int length)
{
	if(index >= length)
		index = index - length;
	
	int left = index - 1;
	left = (left >= 0 ? left : length - 1);
	int right = index + 1;
	right = (right >= length ? right - length : right);
	list[left] = 1;
	list[right] = 1;
}

//具体实施函数
void function(int N, int E, int[] Ts, int[] P)
{
	int[] list = new int[N];
	int[] list1 = new int[N];
	int count = 0; bool c = false;
	do
	{
		if(count == 0)//当前时刻是否需手动启动
		{
			for(int i = 0; i < E; i++)
			{
				if(Ts[i] == count)
					list[P[i]] = 1;
			}
		}
		else
		{
			Array.Copy(list, list1, N);
			for(int i = 0; i < N; i++)
			{
				if(list[i] == 1)
				{
					gettrigger(i, ref list, N);
					i++;
				}
			}
			for(int i = 0; i < E; i++)
			{
				if(Ts[i] == count)
					list[P[i]] = 1;
			}
		}
		count++;
		c = CheckAll(list);
		if(c)
		{
			count = 0;
			string str = "";
			for(int i = 0; i < N; i++)
			{
				if(list1[i] == 0)
				{
					count++;
					str += i.ToString() + " ";
				}
			}
			Console.WriteLine(count);
			Console.WriteLine(str.Substring(0, str.length - 1));
		}
	}
	while(!c);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值