18839/1036
题目描述
这场比赛需要两人一队组队参加,他们不知道怎么分组。已知他们的 CrossFire 分数分别为 a, b, c, d,现在想要把他们两两分为一队,使得他们的实力比较平均,也就是两队的实力差尽量小。
这里定义两队的实力差为每队的 CrossFire 分数之和的差值,现在他们想要知道这个实力差最小是多少。
解法
有两种解法,第一种,先对数据进行排序,然后可以判断出,分数差的最小值是最大的与最小的数据之和减去中间两个数值,要注意的是,差值要求是正数。第二种直接列出数据差的几种情况,然后对其比较,输出最小的值就可以了
18839/1037
题目描述
输入一个整数, 求它的平方根,输出答案往下取整.
比如5=2\sqrt{5} = 25=2, 16=4\sqrt{16}=416=4
输入描述:
输入一个整数n (1 <= n <= 100000)
输出描述:
输出一个整数
这里要注意数据的范围最大到100000要用long long int取存取数据,题目中要求向下取整,需要用到一个强制类型转换,代码如下
#include<stdio.h>
#include<math.h>
int main()
{
long long n,i;
scanf("%lld",&n);
i = (int)sqrt(n);
printf("%lld",i);
return 0;
}
18839/1038
题目描述
给出共享长方体一个顶点的三个面的面积,求它十二条边的边长和。
输入描述:
一行三个整数a, b, c表示面积(1 <= a, b, c <= 10000)。
输出描述:
一行一个整数表示边长和。
此题主要用到数学知识解题
设边长分别为xyz,那么a=x*y,b=y*z,c=x*z
要求出xyz的和,可以将他们先平方
得到(x+y+z)^2=x^2+y^2+z^2+2xy+2yz+2zx
这样可以发现后面的三项就是abc的和的二倍了
然后就是要求出xyz分别的平方(很难想到了QAQ)
c
这样就可以求出(x+y+z)辣
讲到这块还能想到一种办法,因为刚求x^2是x^2=(xy*zx)/yz=a*c/b
那么x=sqrt(a*c/b),其实这样也可以的哦
那么代码如下
1.第一种办法
#include <stdio.h>
#include <math.h>
int main ()
{
int a,b,c,ans;
scanf("%d%d%d",&a,&b,&c);
ans=4*sqrt(a*b/c+a*c/b+b*c/a+(a+b+c)*2);
printf("%d\n",ans);
return 0;
}
2.第二种方法
#include <stdio.h>
#include <math.h>
int main(){
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
printf("%.0f", 4 * (sqrt(a * b / c) + sqrt(a * c / b) + sqrt(b * c / a)));
return 0;
}
这里还要强调一下sqrt()这个函数,他的返回值是一个双精度浮点数,直接用printf和%d输出浮点数的值都会是0,这里可以做一个强制类型转换,将求完的平方根转化为int类型进行输出
或者像第二个代码一样,去输出没有小数部分的浮点数