
这次的题目啊,真的水到不行,宁看看这题,没有输出入要求,就一个点,那我直接暴力输出不就行了,来看看
我一开始的代码啊
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#define itn intusing namespace std;int main(){ cout<<"1.849016"<<endl; return 0;} |
(前面的那一堆头文件是新建就有,不是我特意打上的,逃)
宁看看,满打满算7行就够了,为什么要这么麻烦,还用二分,但是言归正传,我们在水题的时候,当然可以解出方程来,输出。可是如果这个式子再长一点,再难算一点呢?
所以还是要正儿八经的用二分。(话说我们课上刚刚学了二分法解方程)
找零点的时候,只用考虑[f(a)*f(b)<0]&&这个函数是连续不断的就可以了
所以就看一下AC代码吧
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#define itn int#define E 1e-7using namespace std;double f(double x){ double y=x*x*x*x*x-15*x*x*x*x+85*x*x*x-225*x*x+274*x-121; return y;}int main(){ double left=1.5,right=2.4; while(left+E<right) { double mid=(left+right)/2.0; if(f(mid)>0) left=mid; else right=mid; } if(f(left)==0) printf("%.6lf\n",left); else printf("%.6lf\n",left); return 0;} |
按要求的六位输出别忘了,
还有就是千万别忘了开double,不然你出不来这个数
别问了 问就是抄的之前的代码
第二个

题目还是比较好理解的,就是从输入的数据里面找两个值,使得这两个数的和为给定的数M,
举例来说,就是
|
1
2
3
|
4//输入四个数2 5 1 46//最终给定的和 |
如果没有解 就输出No!;
那来看看代码
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#include<cstring>#define itn intusing namespace std;int a[100000];//定义一个一维数组int main(){ int n,m,l,r,mid;//l左指针 r右指针 mid中间数 cin>>n; for(int i=0;i<n;i++) cin>>a[i];//输入数据 cin>>m;//和 sort(a,a+n);//按从小到大排序 for(int i=0;i<n;i++) { l=i;//左 r=n;//右 while(l<=r) { mid = (l+r)/2; if(a[i]+a[mid]==m) { cout<<a[i]<<" "<<a[mid];//中间取 二分 return 0; } else if(a[mid]+a[i]>m) r=mid-1;//大于就向左取 else l=mid+1;//小于就向右取 } } cout<<"No";//没有结果输出No return 0;} |
先把这些数字从大到小排列,方便我们的二分,把中间项定义为mid(最左加最右/2)
然后拿最左与mid来相加与m比较 若是大了就mid向左指一个,反之向右指一个。
其中有一个代码,我一开始写的时候没有加上
|
1
2
|
l=i;//左 r=n;//右 |
没有明白为什么要这么做
于是第一次交的时候就GG了
后来加上了就AC了。
所以二分一定要记得定义指针啊(这不是指针,但是作用差不多,别杠),不要忘记!!!
第三个是来自于洛谷的题目
