牛客刷题
我觉得这个是一个签到题目。毕竟只要会使用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的倍数,
需要加的最小值;
小编没有莽出来这道题目(以上是一个大佬讲的,不久之后我想我会莽出来这道题目)