P1161 开灯 - 洛谷(两种解法)

目录

前言

一、暴力解法

二、使用异或运算



前言

 题目链接:P1161 开灯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一、暴力解法

#include <stdio.h>

int is_on[2000000] = { 0 };  // 0 表示灯是关着的,1 表示灯是开着的

int main()
{
	int n = 0;
	scanf("%d", &n);
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)  // 进行 n 次操作
	{
		double a = 0.0;
		int t = 0;
		scanf("%lf %d", &a, &t);
		for (j = 1; j <= t; j++)
		{
			int index = (int)(a * j);  // 数组下标对应编号
			if (is_on[index])
			{
				is_on[index] = 0;
			}
			else
			{
				is_on[index] = 1;
			}
		}
	}
	// 找到开着的灯的编号
	for (i = 1; i < 2000000; i++)
	{
		if (is_on[i] == 1)
		{
			printf("%d\n", i);
			break;
		}
	}
	return 0;
}

二、使用异或运算

异或运算的性质:

  1. 任意一个变量 x 与其自身进行异或运算,结果为 0,即 x ^ x = 0

  2. 任意一个变量 x 与 0 进行异或运算,结果不变,即 x ^ 0 = x

  3. 异或运算满足结合律,即 a ^ b ^ c = (a ^ b) ^ c = a ^ (b ^ c)

  4. 异或运算满足交换律,即 a ^ b = b ^ a

#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	int result = 0;  // 最后开着的灯的编号
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)  // 进行 n 次操作
	{
		double a = 0.0;
		int t = 0;
		scanf("%lf %d", &a, &t);
		for (j = 1; j <= t; j++)
		{
			int id = (int)(a * j);  // 编号
			result ^= id;
		}
	}
	printf("%d\n", result);
	return 0;
}
  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值