[破碎的状态] [-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;
}
评论 (0)