山东理工训练赛4

来源:互联网 发布:游戏挂机软件 编辑:程序博客网 时间:2024/04/30 17:35

A.题目描述

计算整数n!(n的阶乘)末尾有多少个0。
#include<stdio.h>int count0(int k){     int sum=0;     while(k!=0)     {         k=k/5;         sum+=k;      }      return sum;}int main(){     int n,i,j,x,k;     scanf("%d",&n);     for(i=0;i<n;i++)     {        scanf("%d",&x);          j=count0(x);         printf("%d\n",j);    }    return 0;}

连通网络

Time Limit: 1000MS Memory limit: 65536K

题目描述

网络由基站和基站间线路组成,基站连通表示两个基站可以通过线路互相到达。网络连通代表网络中任意两基站可以互相连通。现有一些网络,求这些网络至少增加多少线路成为连通网络。
 

输入

第一行输入一个数T代表测试数据个数(T<=20)。每个测试数据第一行2个数n,m 分别代表网络基站数和基站间线路数。基站的序号为从1到n。接下来m行两个数代表x,y 代表基站x,y间有一条线路。
(0<n<=1000000, 0<=m <=10000,1<=x,y<=n )
 

输出

对于每个样例输出最少增加多少线路可以成为连通网络。每行输出一个结果。
 

示例输入

23 11 23 21 22 3

示例输出

10

提示

简单dfs 胡乱搞搞

#include<iostream>#include<algorithm>#include<memory.h>#include<cstdio>#include<stack>using namespace std;const int maxn=1000002;const int maxm=100002;int dfn[maxn],low[maxn],n,m,indx,cnt,inStack[maxn],f[maxn][12];stack<int>s;void dfs(int u){    if(!dfn[u])    {        dfn[u]=1;    }    for(int i=1;i<=f[u][0];i++)    {        int v=f[u][i];        if(!dfn[v])        {            dfs(v);        }    }}int main(){    int i,j,k,a,b,t;    cin>>t;    while(t--)    {        scanf("%d%d",&n,&m);        memset(dfn,0,sizeof(dfn));        memset(inStack,0,sizeof(inStack));        memset(low,0,sizeof(low));        memset(f,0,sizeof(f));        indx=0,cnt=0;        for(i=1;i<=m;i++)        {            scanf("%d%d",&a,&b);            f[a][++f[a][0]]=b;            f[b][++f[b][0]]=a;        }        for(i=1;i<=n;i++)        {            if(!dfn[i])            {                cnt++;                dfs(i);            }        }        cout<<cnt-1<<endl;    }    return 0;}


 

多项式求和

Time Limit: 1000MS Memory limit: 65536K

题目描述

多项式描述如下:
1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 ……
先请你求出多项式前n项的和。

输入

第一行输入一个数T代表测试数据个数(T<=1000)。接下来T行每行1个数代表n(0<=n< 2^31)。
 

输出

 对于每个输入样例,输出多项式和的结果(结果精确到小数点后两位)。每行输出一个结果。
 
随便弄了弄。。。。。。。

 

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<cmath>#include<cstdlib>using namespace std;int n,t;double a[10002],ans;int main(){    int i,j;    cin>>t;    while(t--)    {        cin>>n;        ans=0.0;        if(n>=10000) n=10000;            for(i=(n)/2+1;i<=n;i++)            {                ans+=1.0/i;            }        printf("%.2f\n",ans);    }    return 0;}

飞行棋

Time Limit: 1000MS Memory limit: 65536K

题目描述

飞行棋是在一个长度为n的棋盘上走动棋子的游戏。游戏开始时有一个棋子在棋盘的开始,位置是1。然后每一步玩家掷一次骰子,并将棋子往前跳骰子正面大小个格子。
当棋子跳出飞行棋的棋盘时游戏结束。问游戏结束时玩游戏的人掷骰子次数的期望。

输入

 第一行输入一个数T代表测试用例组数(T<=200),接下来T组测试用例,每组测试数据为棋盘大小。

输出

对于每个棋盘,输出玩家要掷骰子次数的期望(结果保留到小数点后4位)。每行输出一个结果。

示例输入

212

示例输出

1.00001.1667

提示 概率 求期望

简单概率DP。。。。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<cmath>#include<cstdlib>using namespace std;const int maxn=100001;double dp[maxn];int n,t,vis[maxn];int main(){    cin>>t;    while(t--)    {        int i,j;        cin>>n;        for(i=0;i<=n+6;i++)dp[i]=0.0;         for(int i=n-1;i>=0;i--)        {                for(int j=1;j<=6;j++)                {                    if(i+j<=n)                    dp[i]+=(1.0/6)*dp[i+j];                    else break;                }                dp[i]+=1.0;        }        printf("%.4lf\n",dp[0]);    }    return 0;}


 

矩形回旋

Time Limit: 1000MS Memory limit: 65536K

题目描述

有一个由 n*m(n是行数,m为列数) 的方格组成的矩形阵列。
现在从左上角开始顺时针旋转走动,遇到矩形边框或者遇到已经过的方格就转向继续,直到走完所有方格。求最后结束点的坐标(横坐标位置从1到m,纵坐标从1到n)。

输入

 第一行输入一个数T代表测试数据个数(T<=20)。接下来T行每行两个正整数n,m ( 0 < n,m < 2^31)。

输出

对于每个输入n,m,输出最后的坐标(中间输出一个空格)。每行输出一个结果。

示例输入

13 3

示例输出

2 2

提示 找规律的东东

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<cmath>#include<cstdlib>using namespace std;int n,m,t;int main(){    cin>>t;    while(t--)    {        int x,y;        cin>>n>>m;        if(n<=m)        {            x=n/2+1;            if(n%2==1)            {                y=m-x+1;            }            else            {                y=n-x+1;            }        }else        {            y=(m+1)/2;            if(m%2==1)            {                x=n-y+1;            }else            {                x=m-y+1;            }        }        cout<<x<<" "<<y<<endl;    }    return 0;}


 

原创粉丝点击