[破碎的状态] [-58] BZOJ 3520
我只是在复习化学
..这题的难度主要在于卡精度....
我们假设这个弱酸的酸根是[tex]X^{n-}[/tex],那么
根据电离常数的定义,可以对于任意i得
[tex]\frac{c(H_{n-i-1}X^{(i+1)-}) * c(H^+)} {c(H_{n-i}X^{i-})} = K_i[/tex]
所以我们反复带入这个式子,可以发现
[tex]\frac{c(H_{n-i-t}X^{(i+t)-}) * c^t(H^+)} {c(H_{n-i}X^{i-})} = K_iK_{i+1}..K_{i+t-1}[/tex]
如此,假设两者浓度相同,就可以得出氢离子浓度应该是[tex]\sqrt[t]{K_iK_{i+1}...K_{i+t-1}}[/tex]
以上是化学分析
下面是写代码..
其实没啥好写的了..把电离常数log下再加一下取个平均数即可快速求出..
然后..没了吧
很果断被卡精度了..
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<math.h> #include<string> #include<time.h> #include<bitset> #include<vector> #include<memory> #include<utility> #include<stdio.h> #include<sstream> #include<fstream> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; long double k[1005]; pair<long double,pair<int,int> > val[1000005]; int sum[1005]; int main() { #ifdef absi2011 //freopen("ka.in","r",stdin); //freopen("ka.out","w",stdout); #endif int n; scanf("%d",&n); int i; for (i=1;i<n;i++) { int x; scanf("%d",&x); k[i]=log10(x); } int num=0; for (i=0;i<n;i++) { long double sum=0; int j; for (j=i+1;j<n;j++) { sum+=k[j]; val[num++]=make_pair(sum/(j-i),make_pair(i,j)); } } sort(val,val+num); int last=0; int max_ans=0; val[num].first=100000.0; for (i=1;i<=num;i++) { if (val[i].first-val[i-1].first>0) { int j; for (j=last;j<i;j++) { sum[val[j].second.first]++; sum[val[j].second.second]++; max_ans=max(max_ans,sum[val[j].second.first]); max_ans=max(max_ans,sum[val[j].second.second]); } for (j=last;j<i;j++) { sum[val[j].second.first]--; sum[val[j].second.second]--; } last=i; } } printf("%d\n",max_ans+1); return 0; }