考试

好吧,今天又考试了
之所以是又,因为来的那天也有一次考试。但是那次的题目比较简单,算是摸底。
今天的考题是测试前几天学的内容:模拟、贪心、分治、数论。貌似今天的题挺简单的,毕竟有三个人AK了。但是,我惨兮兮的只有一百八,还得到了旁边比我分高了一半的小弟弟的询问,他太强了。

首先第一题就没有分,有的是运行错误,有的时超时,有的是输出错误。毕竟我样例都没过。但是,我调了三个小时里的一半时间也就是约等于就是分钟的时间写他,太催了。
第二题是贪心,明明都是对的,但是偏偏最后一个点过不去,说是超时。可是明明都是一重循环诶,而且次数不超过10^5。
第三题是数论,求三个数的最小公倍数。拿了一半的分。剩下的一半是答案错误。
第四题也是数论,而且老师昨天晚上刚讲过,而且老刘给我们讲数论的时候也说过集训要考,而且昨天老师也说今天会考。艾玛,说了这么多的而且。总而言之,我以为不能看PPT,所以没有去看PPT上的代码。然后自己写了一个,有个四十分。
所以剩下没有拿到的分基本上是运行超时或者答案错误。


T1刘天泽的完全记忆能力
题目描述】准确的说,题目描述是有些血腥的,毕竟刘天泽要咬掉陈卓的头还是有点恐怖的,所以陈卓为了防止头皮坏死就要编代码。就是刘天泽有完全记忆功能。要陈卓出题考验他。所以输入一串字母,,并且询问他字母c出现k次的位子,二刘天泽的答案也会输入,判断是否都正确,如果正确输出“AK”,否则输出错误的次数。

题解】我还不如输出“AK”,还能骗个10分,不至于爆零这么惨。其实这题只要模拟就行,但是要注意存储,还要输入输出。输入输出要用scanf和printf,否则很可能会超时。

代码+注释:

#include<bits/stdc++.h>
using namespace std;
int n,m,b[50]={},a[30][51000]={},c,ans,k,s=0;
char ch;
int main()
{
    freopen("index.in","r",stdin);
    freopen("index.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)//将字符ch放入数组a。其中a[i][j]表示字母i出现j次的位子.
    {
        scanf(" %c",&ch);
        c=int(ch-'a'+1); 
        a[c][++b[c]]=i;
    }
    for (int i=1;i<=m;i++)//进行查询 
    {
        scanf(" %c%d%d",&ch,&k,&ans);//输入需要查询的字符、出现的次数、刘天泽的答案 
        int x=int(ch-'a'+1);
        if (a[x][k]!=ans)//判断答案是否正确 
          s++;
    }
    if (s==0)
      printf("AK");//用printf输出的时候,字符串直接printf("字符串"); 
    else printf("%d",s); //输出其他类型时,在括号内不需要加&。 
    fclose(stdin);
    fclose(stdout);
    return 0;
}

再说一句:老师本来是为了黑小黑一把,没想到把他的名字打错了,是刘天择。尴尬!!

===============================
T2 UOI金牌选手小X虐你们来啦!
题目描述】十分牛掰的小X要出题,输入他出题的总数量和出题的时间,然后输入出每道题所需的时间,求最多能出几题。

题解】这是一道十分明显与简单的贪心。虽说贪心只能过样例,但是貌似不管是样例还是测试数据都过的很顺利,除了最后一个点莫名其妙的超时。这题的贪心十分明显,就是按照出题的时间从小到大排序,然后将时间减去出题的时间,如果没有小于零,说明这道题就可以出,否则后面的题都不能出。

具体代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[100010]={};
int n,m;
int ans=0;
int main()
{
    freopen("zzx.in","r",stdin);
    freopen("zzx.out","w",stdout);
    cin>>n>>m;
    for (int i=1;i<=n;i++)//输入每题所需的时间 
      cin>>a[i];
    sort(a+1,a+n+1);//按照时间长短排序 
    for(;m-a[++ans]>=0;)//如果剩下的时间还够出a[ans]这题,则ans++,剩下的时间减去a[ans]; 
        m-=a[ans];
    cout<<ans-1<<endl;
    fclose(stdin);
    fclose(stdout);
    return 0;
} 

我本来是正着想,出题的时间一个个累加,直到时间超过m,再输出ans,但是就是莫名其妙的卡在最后一个点。当然,现在已经解决了。

========================================
T3 晨跑
题目描述】作为好学生的孙文努力争当二好学生,学习好、身体好。所以他坚持每a天跑一次步。而他的好朋友小Y和小Z也受到了他的影响,小Y坚持b天跑一次步,小Z每c天跑一次步。有一天,他们一起跑了一次步,问下一次三人一起跑步是什么时候。

题解】其实这是一道十分简单的数论,也就是求三数的公约数。最小公倍数=最大公因数*(每个数都除以最大公因数)

代码如下:

#include<bits/stdc++.h>
using namespace std;
int gcd(long long x,long long y)//求最大公因数
{
    if(y==0)
     return x;
    return gcd(y,x%y);
}
int main()
{
    freopen("running.in","r",stdin);
    freopen("running.out","w",stdout);
    long long a,b,c,k,l,k1;
    cin>>a>>b>>c;
    k=gcd(a,b);
    l=(a/k)*b;
    k1=gcd(l,c);
    l=(l/k1)*c;
    cout<<l<<endl;
    fclose(stdin);
    fclose(stdout);
    return 0;
}

================================================
T4 黄老师难题
题目描述】也就是黄老师上课讲的题,n!的结果末尾会有几个零。但是啊,偏偏老刘想要黑黄老师一把,于是,他加上了:黄老师想问你,你能秒掉吗?更尴尬的是,我中午吐槽的时候根本没注意到在远处的黄老师,于是……
幸好老师在接电话。我侥幸逃过一劫。

题解】由于2 的个数绝对比5 的个数多,所以我们只要求出n!中含有几个5相乘。n!分解质因数之后,质因子p的重数公式: [n/p]+[n/p^2]+[n/p^3]+…这里的p就是5 了
所以代码如下:

#include<bits/stdc++.h>
using namespace std;
int fact(int n,int p)
{
    int res=0;
    while (n>0) res+=n/=p;
    return res;
}
int main()
{
    freopen("zero.in","r",stdin);
    freopen("zero.out","w",stdout);
    int n;
    cin>>n;
    cout<<fact(n,5)<<endl;
    fclose(stdin);
    fclose(stdout);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值