这次就做了一道题,而且还过的好慢。。哎。。说多了都是泪啊。
A. Little Pony and Crystal Mine
题意:看图就明白。输入n,输出类似图形。比如输入5,输出
**D** *DDD* DDDDD *DDD* **D**
思路:直接写,挺简单的一题。哎刚开始写,脑子一混乱,就碍了好久。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main(){
int n=0;
scanf("%d",&n);
int l=n/2+1,r=n/2-1;
for(int i=0;i<n;i++){
if(i<=n/2){
l--;
r++;
}
else{
l++;
r--;
}
for(int j=0;j<l;j++)
printf("*");
for(int j=l;j<=r;j++)
printf("D");
for(int j=r+1;j<n;j++)
printf("*");
printf("\n");
}
return 0;
}
题意:对给定的一个数列,做如下操作,将最后一个元素放到第一位。问能否在有限的步数内使得数列成一个不递减数列。能,输出步数,不能,输出-1。
思路:判断数列中是否至多存在一对(a[i],a[i+1])满足a[i]>a[i+1]。当然对首尾还需要判断,有些情况也需要特判。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main(){
int kk=-1;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
bool tag=true,flag=true;//flag 判断初始数列是否为不递减数列。
for(int i=0;i<n-1;i++){
if(a[i]>a[i+1]&&flag){
kk=i+1;
flag=false;
}
else if(a[i]>a[i+1]&&!flag)
tag=false;
}
if(flag&&a[n-2]<=a[n-1])
printf("0\n");
else if(tag&&a[0]>=a[n-1])
printf("%d\n",n-kk);
else if(!tag||(tag&&a[0]<a[n-1]))
printf("-1\n");
return 0;
}
C. Little Pony and Expected Maximum
题意:输入m,n 代表投掷一个m面的骰子n次,求n次得到最大数字的期望。
思路:对于最大数字为i
可以发现投掷一次可产生i种最大数字小于等于i的情况,其中1种是i,另外i-1种是小于i的。
那么投掷两次可产生i^2种最大数字小于等于i的情况,其中上一次投掷的小于i的每种结果都会产生i-1种小于i的,所以小于i的总共有(i-1)^2种,是i的有i^2-(i-1)^2 种。
那么可推至n次,产生i^n种最大数字小于等于i的情况,其中小于i的有(i-1)^n种,那么等于i的就有i^n-(i-1)^n种。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
double fast(double c,int d)//矩阵快速幂。好像不能直接用pow()函数,因为精度的问题。
{
double res=1.0;
while(d)
{
if(d&1)
res*=c;
c*=c;
d>>=1;
}
return res;
}
int main(){
int m,n;
double ans=0;
scanf("%d%d",&m,&n);
for(int i=1;i<=m;i++)
ans+=i*(fast(i/(1.0*m),n)-fast((i-1)/(1.0*m),n));//不可先算总的再除以m^n,这样会超出double 范围。
printf("%.12lf\n",ans);
}
总的来说这次比赛做的相当差。。。。