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