• 低智商屌丝蒟蒻的2012成都题解


    本来不想写这个东西的,不过昨天看到微软的blog说IT企业招聘的时候,如果有自己的技术blog是有很大加分的,于是开搞

    纯属班门弄斧,毕竟我的水平和大牛们还差的很远呢!

    http://board.acmicpc.info/icpc2012/nsu_onsite.php

    [A题][HDU 4464]

    Browsing History 

    就是个sb题,全场都AC了,当然了 我更sb,还交出了一个wrong answer
    View Code
     1 #include<cstdio>
     2 #include<vector>
     3 #include <iostream>
     4 #include<algorithm>
     5 #include<cmath>
     6 #include<sstream>
     7 using namespace std;
     8 int main(int argc, const char * argv[])
     9 {
    10     string s;
    11     int n,t=1;;
    12     int MAX;
    13     while(cin>>n)
    14     {
    15         MAX=0;
    16         for(int i=0;i<n;i++)
    17         {
    18             cin>>s;
    19             int ans=0;
    20             for(int j=0;j<s.length();j++)
    21             {
    22                 ans+=s[j];
    23             }
    24             MAX=max(MAX,ans);
    25         }
    26         cout<<"Case "<<t++<<": "<<MAX<<endl;
    27     }
    28         return 0;
    29 }
     
    [I题][HDU 4472]

    Count

    这题也是个很水的dp题,不过我英语是硬伤,一直到60min+才读懂,然后用几分钟时间就过掉了

    此题递归递推都不难,反正就是 具有 n个节点的子树的排列方式数量ans为

                  dp(n)=∑{i 是n-1的约数| dp(i)} 边界条件自然是 n=1时为1

          渣代码,没有优化,关键代码为

    View Code
     1 long long dp(int n)
     2 {
     3     if(d[n])return d[n];
     4     long long ans=0;
     5     for(int i=1;i<=n;i++)
     6     {
     7         if((n-1)%i==0)ans+=dp(i);
     8         ans%=mod;
     9     }
    10     return d[n]=ans%mod;
    11 }

    [K题][HDU 4474]

    Yet Another Multiple Problem

    这道题比赛的时候不是我过的,而且一开始我还乱搞 wa了一发

    首先暴力肯定是不行的,这道题利用了大数取模的原理,简单的说就是 (10*a+b )mod c = (a mod c)*10 + b mod c

    所以只要用bfs 按位搜索即可,实现的时候可能会有点麻烦,我用的是 class + string +queue的方式

    关键代码如下

    View Code
     1 class node{
     2 public:
     3     string s;
     4     int mod;
     5 };queue<node>q;
     6 string ans;int n ;
     7 int d[10000];
     8 void bfs()
     9 {
    10     node & t = q.front();
    11     if(t.mod==0) {
    12         ans=t.s;
    13         return;
    14     }
    15     for(int i=0;i<10;i++)
    16     {
    17         if(a[i])continue;
    18         if(d[(10*t.mod+i)%n])continue;
    19         if((10*t.mod+i)%n==0)ans=t.s+char('0'+i);
    20         node temp={t.s+char('0'+i),((10*t.mod)+i)%n};
    21         q.push(temp);
    22         d[temp.mod]=1;
    23     }
    24   q.pop();
    25     return ;
    26 }

    最后是[B题][HDU 4465]  Candy

    离比赛结束还有17分钟时候过掉了,其实封榜前5分钟这题目已经基本搞定了,只是没有考虑精度的问题 wa了一发,后来改来改去也没弄明白,甚至想用java搞(现在想想真是太扯淡了)

    最后搞出了一个边乘边除的方法,极限数据依然过不去,抱着试试的心态交了一发, 尼玛居然是TLE,当时看到这个结果是又高兴又闹心啊,果断把cin和cout改成scanf和printf 又交了一发

    几分钟后返回了一个绿色的YES,当时尼玛整个人都蹦起来了! 赛后得知其实就算B题没过也是银牌,但是多一道题总比少一道题强, 废话太多了 进入正题;

    若总共取糖果的次数为m(不考虑最后一次) ,则 显然  n<=m<=2n

    期望公式Ε=∑ P * N    p为概率 n为数量

    其中  P=p*C(n,m)*pn*(1-p)m-n  即 总共取了m次,其中 n次取了第一个盒子,剩下的 m-n次取了第二个盒子, 然后别忘了最后一次打开的空盒也要乘一次p

    N= 2*n-m  这个好理解 总共2n个糖果,取走m个 

    再注意到 概率式子中的 pn是不变的,可以提取出来 ,并且 C(n,m+1)=C(n,m)*(m+1)/(m-n+1)

    蒟蒻表示能想到这里已经是极限了,根本就没有想到取对数的方法,惯例 渣渣代码

    View Code
     1 double solve (int n,double p)
     2 {
     3     double ans=n*p;
     4     double last=1;
     5     for(int m=n+1;m<=2*n;m++)
     6     {
     7         last*=(1-p)*(m)/(m-n)*p;
     8         ans+=last*(2*n-m);
     9         ans*=p;
    10     }
    11     return ans;
    12 }

    最后结果为 solve(n,p)+solve(n,1-p)

    蒟蒻的2012成都现场赛解题报告到此为止 谢谢大家

  • 相关阅读:
    第一堂课20210302
    第一堂课20210301
    第一堂课20210301
    实验2-3-1 求1到100的和 (10分)
    实验2-3-2 求N分之一序列前N项和 (15分)
    实验2-3-3 求奇数分之一序列前N项和 (15分)
    实验2-3-4 求简单交错序列前N项和 (15分)
    实验2-3-5 输出华氏-摄氏温度转换表 (15分)
    实验2-3-6 求交错序列前N项和 (15分)
    实验2-3-7 求平方与倒数序列的部分和 (15分)
  • 原文地址:https://www.cnblogs.com/goagain/p/2778633.html
Copyright © 2020-2023  润新知