本来不想写这个东西的,不过昨天看到微软的blog说IT企业招聘的时候,如果有自己的技术blog是有很大加分的,于是开搞
纯属班门弄斧,毕竟我的水平和大牛们还差的很远呢!
http://board.acmicpc.info/icpc2012/nsu_onsite.php
[A题][HDU 4464]
Browsing History

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 }
Count
这题也是个很水的dp题,不过我英语是硬伤,一直到60min+才读懂,然后用几分钟时间就过掉了
此题递归递推都不难,反正就是 具有 n个节点的子树的排列方式数量ans为
dp(n)=∑{i 是n-1的约数| dp(i)} 边界条件自然是 n=1时为1
渣代码,没有优化,关键代码为

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的方式
关键代码如下

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)
蒟蒻表示能想到这里已经是极限了,根本就没有想到取对数的方法,惯例 渣渣代码

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成都现场赛解题报告到此为止 谢谢大家