低智商屌丝蒟蒻的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成都现场赛解题报告到此为止 谢谢大家

posted @ 2012-11-20 10:48  goagain  阅读(...)  评论(... 编辑 收藏