又是一道数学题:(三分法)
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 using namespace std; 5 int main() 6 { 7 double H,h,D,l,r,mid,mmid; 8 int n; 9 scanf("%d",&n); 10 while(n--) 11 { 12 scanf("%lf%lf%lf",&H,&h,&D); 13 l=(H-h)*D/H; 14 r=D;mid=0;mmid=0; 15 while(r-l>1e-9) 16 { 17 mid=(l+r)/2; 18 mmid=(mid+r)/2; 19 if((mid+(H-h)*D/mid)>(mmid+(H-h)*D/mmid)) 20 l=mid; 21 else if((mid+(H-h)*D/mid)<(mmid+(H-h)*D/mmid)) 22 r=mmid; 23 else 24 break; 25 } 26 printf("%.3lf ",D+H-(l+(H-h)*D/l)); 27 } 28 return 0; 29 }
貌似不能二分角度!没有图不好说,具体参见:http://blog.csdn.net/freezhanacmore/article/details/9887115(里面有数学解法)
Palindrome POJ 3974
一道求最长回文子串:(必须是连续的)
就是用什么Manacher算法:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<string.h> 5 #include<string> 6 using namespace std; 7 char a[1000005],b[2000005]; 8 int d[2000005]; 9 int main() 10 { 11 int n,i,mia,ip,max1,d1=0; 12 while(scanf("%s",a)!=EOF) 13 { 14 if(a[0]=='E') 15 break; 16 n=strlen(a); 17 b[0]='@'; 18 b[1]='#'; 19 for(i=0;i<n;i++) 20 { 21 b[i*2+2]=a[i]; 22 b[i*2+3]='#'; 23 } 24 b[2*n+2]='