山东理工训练赛4

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 )
 

输出

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

示例输入

2
3 1
1 2
3 2
1 2
2 3

示例输出

1
0

提示

简单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位)。每行输出一个结果。

示例输入

2
1
2

示例输出

1.0000
1.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,输出最后的坐标(中间输出一个空格)。每行输出一个结果。

示例输入

1
3 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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值