標籤:style http color os io ar for art sp
A:Little Pony and Permutation
直接暴力搜尋,複雜度O(n)
#include<stdio.h>#include<iostream>#include<stdlib.h>#include<string.h>#include<algorithm>#include<vector>#include<math.h>#include<queue>#include<stack>#include<map>#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define maxn 110000int a[maxn];int vis[maxn];int main(){ int n; while(~scanf("%d",&n)) { for(int i=1;i<=n;i++)scanf("%d",&a[i]); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { if(vis[i])continue; int x=i; cout<<"("<<x; vis[x]=1; x=a[x]; while(!vis[x]) { vis[x]=1; cout<<" "<<x; x=a[x]; } cout<<")"; } cout<<endl; } return 0;}
B:Little Pony and Alohomora Part I
我們可以發現,這是一個調和序列。
然後。。。就很那個啥了。。、
#include<stdio.h>#include<iostream>#include<stdlib.h>#include<string.h>#include<algorithm>#include<vector>#include<math.h>#include<queue>#include<stack>#include<map>#pragma comment(linker, "/STACK:1024000000,1024000000")using namespace std;#define maxn 1100000double f[maxn];int main(){ int n; f[1]=1.0; for(int i=2;i<maxn;i++)f[i]=f[i-1]+1.0/i; while(~scanf("%d",&n)) { if(n<maxn)printf("%.4lf\n",f[n]); else printf("%.4lf\n",log(n)+0.5772156649); } return 0;}
C:Little Pony and Dice
dp[i]: 恰好走到i點的機率
dp[i]=dp[i-1]*(1/m)+(dp[i-1]-dp[i-m-1]*(1.0/m))
dp[i-1]*(1/m)代表從i-1這個點走到i點的機率。
(dp[i-1]-dp[i-m-1]*(1.0/m))所有走到i-1的點除了i-m-1點外,其他的點都能走到i,並且走到i-1和走到i的機率相同
如果相鄰的兩個i之間的dp[i]相差很小,那說明下一個dp[i]的變化也會很小。以後就都是這個定值了。所以直接輸出就好。
<pre name="code" class="cpp">#include<iostream>#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<vector>#include<set>#include<string>#include<math.h>using namespace std;#define LL __int64#define maxn 703000#define eps 1e-13#define zero(x) (fabs(x)<eps?0:x)double dp[maxn];int main(){ int n,m; while(~scanf("%d%d",&m,&n)) { dp[0]=1.0; dp[1]=1.0/m; int i; for(i=2;i<=n;i++) { dp[i]=dp[i-1]+dp[i-1]*1.0/m; if(i>m)dp[i]=dp[i]-dp[i-m-1]*1.0/m; if((zero(dp[i]-dp[i-1])==0)) { printf("%.5lf\n",dp[i]); break; } } if(i>n)printf("%.5lf\n",dp[n]); } return 0;}
BestCoder Round #7-A,B,C