好吧,今天又考试了
之所以是又,因为来的那天也有一次考试。但是那次的题目比较简单,算是摸底。
今天的考题是测试前几天学的内容:模拟、贪心、分治、数论。貌似今天的题挺简单的,毕竟有三个人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;
}