2020/6/26的牛客训练赛部分题解

牛客刷题

在这里插入图片描述

	我觉得这个是一个签到题目。毕竟只要会使用sqrt,floor和ceil函数就好。	
	值得注意的是:int是不足以承载10^12的数字的。
	这里使用double比较好(long long也可以)
	这里不过多累赘。

代码如下:

#include <iostream>
#include<algorithm>
using namespace std;
int main()
{
    double n;
    cin >> n;
    double p = sqrt(n);
    double maxnum = ceil(p) * ceil(p);
    double minnum = floor(p) * floor(p);
    if (maxnum - n > n - minnum)
        printf("%.0lf\n",minnum);
    else
        printf("%.0lf\n", maxnum);

}

在这里插入图片描述

B题目:(小编在写的时候,题目很长,一直在纠结,没看懂。后来才理解)
	这道题目考你对于异或的理解,其实a⊕b = c,b⊕c = a,c⊕a = b
	所以这道题目你应该知道只有三个解:-1,1,2。至于为什么只有两个解,
	是因为K的值x,y要异或之后相等才有路。所以基本上数字固定了。
	一种情况:正好有路,答案为1,就是x⊕y = k
	另一种情况:有一个中间变量。中间变量由上面公式可得中间变量值是固定的。
	只要你去找是不是有数字里面这个权值。而且a[x]==a[y],才有路行走。
	(这个可以证明的)
#include <iostream>
#include<algorithm>
using namespace std;
bool vis[2000000];//标记是否有这个数字
int a[2000000];
int main()
{
    int n, q;
    scanf("%d%d", &n, &q);
	for (size_t i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
		vis[a[i]] = true;
	}
	int x, y, k;
	while (q--)
	{
		scanf("%d%d%d", &k, &x, &y);
		x--; y--; 
		//这里是从1开始的,我们下标是从0开始的
		if (a[x] == a[y] && vis[k ^ a[x]] == true)
			puts("2");//主要这个print超时了,选择puts
		else if((a[x]^a[y])==k)
			puts("1");
		else
			puts("-1");
	}

}

C题

在这里插入图片描述

考察GCD(最大公因子性质)
	我们根据多个数gcd的性质,gcd(x,y,z) = gcd(x,y - x,z - y)
	对所有数+x是不会影响后面那部分差分值的gcd结果的;
	所以后面那部分差分值的gcd其实就是我们能得到的最大gcd;
	要找的x其实就是要在数组的所有数中任选一个数使他成为这个gcd的倍数,
	需要加的最小值;	
小编没有莽出来这道题目(以上是一个大佬讲的,不久之后我想我会莽出来这道题目)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值