题目描述:
”可恶,我们辛辛苦苦算出来的和他们猜出来的是一样的。“ —— 某数学系生
给定一个表达式如下,
输入格式:
对于每组用例,给定不超过1000的五个自然数
,在一行用空格隔开。
输出格式:
对于每组用例,输出表达式的值,保留一位小数,每个答案占一行。
样例输入:
2
1 1 1 1 1
1 2 3 2 3
样例输出:
6.3
127.2
题目大意:
给出一个二重积分和其中的一些常数,求解这个积分式子的答案。
解题思路:
这道题重点在第一句话!!"可恶,我们辛辛苦苦算出来的和他们猜出来的是一样的",说明这道题可猜,(如果会算的当然一眼瞪出来更好)那么如何猜?
首先根据积分的线性性质拆成4项,观察前两项都是关于x或y轴对称的奇函数,所以积分得0,第三项是常数,积分出来是pi*r*r,那么只需要看第四项,这一项也可以分离常数,得到一个min(d,e)+abs(d-e)*(phi(x)/(phi(x)+phi(y)))注意到积分区域有对称性,所以不管分子剩下的是d那一项还是e,都可以有如上表示。
我们发现未知的部分只有(phi(x)/(phi(x)+phi(y)),然而用例给了两个,我们可以通过用例把这个东西算出来!根据第二个用例,减去前几项的已知部分,剩下这部分的值为pi*9/2,而前面几项都是含r*r的,那么这未知的项有很大概率也是有r*r,所以变为abs(d-e)/2*pi*r*r
综上答案就是(c+min(d,e)+abs(d-e)/2)*pi*r*r
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstring>
#include <cmath>
#include <map>
#include <queue>
#include <string>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int INF=0x3f3f3f3f;
#define CLR0(a) (memset(a,0,sizeof(a)))
#define CLR1(a) (memset(a,-1,sizeof(a)))
#define CLRf(a) (memset(a,0x3f,sizeof(a)))
#define pi 3.1415926
const int maxn=0;
const int maxm=0;
double abss(int x)
{
if(x>0)return x*1.0;
return -x*1.0;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int b,c,d,e,r;
scanf("%d%d%d%d%d",&b,&c,&d,&e,&r);
printf("%.1lf\n",(c+min(d,e)+abss(d-e)/2)*r*r*pi);
}
return 0;
}

本文介绍了一种通过观察和分析给定样例来猜测积分题解的方法。通过对积分表达式的分解,利用对称性和给定的数据点,推导出一个简洁的公式用于快速求解。该方法适用于特定形式的积分问题。







2605

被折叠的 条评论
为什么被折叠?



