absi2011's Blog & Daily Life.

全新的开始       我要省选翻盘       I wanna AK in 高考\化学       自此,生无可恋
[破碎的状态] [-59] [APIO2016] Gap
[破碎的状态] [-56] Hdu 5474 A simple graph problem

[破碎的状态] [-58] BZOJ 3520

absi2011 posted @ May 25, 2016 08:59:47 AM in 刷题记录 with tags 小高考 bzoj , 564 阅读

我只是在复习化学

..这题的难度主要在于卡精度....

我们假设这个弱酸的酸根是[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;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter