2018-07-28 七月月赛

  • A  -- 商

  • Description

编一个程序求A/B的值 ,要求精确到小数点后N位(N<=80的自然数,并且A<B,A和B是整型 数范围),不足N位的用“0”补齐。例如:精确到小数点后9位:6/7=0.857142857。输入A、B、N, 求A/B

  • Input

输入文件: 只有一行,就是A,B,N

  • Output

输出文件: 只有一行,就是A/B的结果

  • Sample Input

6 7 9

  • Sample Output

0.857142857

  • 题目理解

模拟除法,每位的到商然后将模数左移当成接下来的除数

#include<cstdio>
int main()
{
    int a,b,n;
    scanf("%d%d%d",&a,&b,&n);
    printf("0.");
    for(int i=0;i<n;++i){
        a*=10;
        printf("%d",a/b);
        a=a%b;
    }
    printf("\n");
    return 0;
}
  • D  -- 神奇的金字塔

  • Description

总所周知,CSU没有金字塔,但在世界某地有一座神奇的金字塔。

神奇的金字塔位于N*N的网格地上。

第0分钟时,金字塔底面很小,只占据(x,y) 这个格子,之后每过一分钟,金字塔会长大,就算超过边界也会继续长大,不过边界外是无限深渊,所以超过边界的部分不算占据的面积,而且由于是无限深渊,不需要考虑什么时候被填满的问题。

扫描二维码关注公众号,回复: 2647656 查看本文章

那么现在问题来了,至少在第几分钟网格上才至少有C个格子被金字塔占据

  • Input

每组数据每一行有4个整数,N,X,Y,C

其中,n,x,y,c<=109,c<=n^{2}

  • Output

对于每组数据,输出一行

一行仅包含一个整数,表示至少过几分钟图上才至少会有C个格子被占据

  • Sample Input

9 3 8 10

  • Sample Output

2

  • 题目理解

WA了无数次,后来将这个看成四个三角形计算出来的                                                                                                                    

 

将构成三角形的两条边计算出来,然后比较但是时间下能够取得长度,计算(1+mid)*mid/2;然后计算出溢出的部分;这里还有一个就是当e1方向和e2方向减去多出的部分有可能减去重复的部分这里还要加回来。由于时间决定计算过程所以二分时间即可。最后一个坑就是这种方法因为当时间为0的时候已经有1所以sum初始值为1,而且0不在二分区间内所以要单独判断这种情况。总结就是很多坑很多坑!

#include<cstdio>
typedef long long ll;
ll len[4];
int main(){
     ll n,x,y,c;
     scanf("%lld%lld%lld%lld",&n,&x,&y,&c);
     len[0]=x-1,len[1]=n-y;//得到四个方向距离边界的长度,顺时针方向
     len[2]=n-x;len[3]=y-1;
     ll ans=0;
     for(int i=0;i<4;++i)
        if(ans<len[i])
          ans=len[i];
     ans=(ans+1)*2;
     ll l=1,mid=0;
     while(l<ans){
        mid=(l+ans)/2;
        //printf("%lld %lld %lld\n",l,ans,mid);
        ll sum=1;
        for(int i=0;i<4;++i){
            int e1=len[i]+1,e2=len[(i+1)%4];
            //printf("&&&&%d %d %d\n",e1,e2,sum);
                sum+=(mid+1)*mid/2;
                //printf("@%d %d ",mid,       sum);
                if(mid>e2){
                    int t=mid-e2;
                    if(t>1){
                       sum-=(1+t)*(t)/2;
                    }else sum-=1;
                    //printf("#%d \n",sum);
                }
                if(mid>e1){
                    int t=mid-e1;
                    if(t>1){
                       sum-=(1+t)*(t)/2;
                    }else sum-=1;
                    //printf("$%d \n",sum);
                }
                if(mid-e1-e2>0){
                    int t=mid-e1-e2;
                    if(t>1){
                        sum+=(1+t)*t/2;
                    }else sum+=1;
                }
        }
        //printf("!!!%lld\n",sum);
        if(sum>=c)
                ans=mid;
            else
                l=mid+1;
     }
     if(c>1)
        printf("%lld\n",ans);
    else
        printf("%lld\n",0);
     return 0;
}
  • E  -- 疯狂的企鹅

  • Description

在鹅厂工作的DJ开始训练起了鹅厂的企鹅们,现在DJ教小企鹅玩一个疯狂的游戏(危险游戏,小朋友请勿模仿)。

现在有一排小企鹅,从左到右编号为1....N,每个小企鹅有一个数字,每天早上,如果一个小企鹅发现他右边的小企鹅的数字比他的小,他就会消灭这个小企鹅。问到了第几天才会没有小企鹅可以被消灭,你需要输出天数-1的值

注:所有小企鹅的数字是1...N的排列

  • Input

每组数据输入格式如下:

第一行一个整数N (N<=10^6)

第二行N个整数,表示1...N号小企鹅的数字

  • Output

每组数据一行,每行一个整数表示输出天数-1的值

  • Sample Input

6

6 1 2 3 4 5

6

6 2 3 5 4 1

6

6 5 4 3 2 1

  • Sample Output

5

3

1

  • 题目理解

当出现5  4  2  1此类的顺序递减的序列的时候只需要花费一条就可以消灭所有需要消灭的小企鹅(类似多米诺骨牌)                         如果出现 7  6  4  5  3  2  1 这样4不能消灭5所以这里具有两段顺序递减序列需要两天所以这里的5>4贡献1天                                  如果出现5  3  2  1  7  6  4这里1>7但是这时候不能将两段相加对于7来说等于重新开始而左边最后只剩下5,于是我们使用pre记录下上面一个序列的首元素相比较判断需要不需要重新计算                                                                                                               最后我们根据上面的规律得出每一段消灭小企鹅需要的时间,取最大值就是题意需要求的值

#include<cstdio>
#include<cstring>
const int maxn=1e6+5;
int a[maxn],dp[maxn];
int main()
{
    int n,pre;
    while(scanf("%d",&n)!=EOF){
        memset(dp,0,sizeof(dp));
        pre=1;dp[1]=1;
        for(int i=1;i<=n;++i){
            scanf("%d",&a[i]);
        }
        for(int i=2;i<=n;++i){
            if(a[i]>=a[i-1])
                dp[i]=dp[i-1]+1;
            else
                dp[i]=dp[i-1];
            if(a[i]>=a[pre]){
                pre=i;
                dp[i]=1;
            }
        }
        int ans=-1;
        for(int i=1;i<=n;++i){
            if(dp[i]>ans)
                ans=dp[i];
        }
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zm_zsy/article/details/81263890