集训的第一次考试~~
OK,那么进入正题
第一题
ltz的完全记忆能力
(index.pas/c/cpp)
【问题描述】
ltz告诉cz他有完全记忆能力,ltz能把所有记忆都记得一清二楚。不过cz没有相信,cz找了一串只由小写字母组成的序列,每次他将提问lltz某个小写字母第k次出现的位置。这把cz也难住了,没办法,找了热爱编程的你~~
【输入】
总共1+n+m行。第一行为两个正整数n和m,n表示序列的长度,m表示cz提问的次数。接下来n行,每行一个小写字母,分别表示序列中的n个小写字母。接下来m行,每行一个小写字母c(小写字母c后有且仅有一个空格)和两个正整数k,ans,表示cz提问小写字母c第k次出现的位置(保证小写字母c出现的次数不少于k),以及ltz的答案ans。
【输出】
总共1行。若ltz的答案全对,则输出“AK”,否则输出ltz错误的次数。
【输入输出样例1】
index.in | index.out |
5 2 i n d e x n 1 2 x 1 5 | AK |
【输入输出样例2】
index.in | index.out |
5 3 y h y a k y 2 1 y 1 1 k 1 5 | 1 |
【数据范围】
对于60%数据,1≤n≤1000,1≤m≤1000。
对于100%数据,1≤n≤500000,1≤m≤500000,每个字母出现次数不超过50000。
#include<bits/stdc++.h>
using namespace std;
int n,m,i,ans=0,j,a[100003]={};//让结构体更方便计入的数组
struct ss//定义一个结构体,题目就简单了
{
char l;//这次的字符
int r;//他出现的次数
}b[500002];
inline const long long read()//快读,Pascal读入是快,但c++的cin可不,觉得scanf不够保险,就用了longlong的快读
{
long long num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9')
{
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9')
{
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
int main()
{
freopen("index.in","r",stdin);
freopen("index.out","w",stdout);
n=read();m=read();
for(i=1;i<=n;i++)//输入
{
char c;
cin>>c;
a[c]++;//计入这个字符出现的总次数
b[i].l=c,b[i].r=a[c];//读入这个字符是什么,这个字符在这时出现了几次
}
for(i=1;i<=m;i++)//输入ltz的猜测
{
char c;
cin>>c;
int x,y;
x=read();y=read();
if(b[y].l!=c||b[y].r!=x)//判断是否对
ans++; //不对计数+1;
}
if(ans==0)//如果没错误
printf("%s","AK");
else
printf("%d",ans);//有错输出错误次数
fclose(stdin);
fclose(stdout);
return 0;
}
因为只有我是快读,so最快喽(这题因为读入让很多人的400都变成了380,嗯,其实scanf也行
先看看成绩表吧
剩下的,就不列出了吧。。有点难看了。。
第二题
金牌选手小X虐你们来(。。)
(zzx.pas/c/cpp)
【问题描述】
当UOI金牌选手小X看到这套题以后,觉得作为NOIP普及组模拟赛太水了,于是他打算出一套NOIP爆0模拟赛给小朋友们做做。现在小X神犇已经构思好了n道题,且估算出了这出第i道题需要的时间a[i](单位:微秒)。由于小X出的每一道题都足够虐爆全场,所以他只需要出的题数尽量多。现在他想知道,在m微秒内,最多可以出几道题。
【输入】
总共2行。第一行为两个整数n和m。第二行有n个整数,第i个数表示a[i]。
【输出】
总共1行。第一行为1个数,在m微秒内最多可以出几道题。
【样例】
zzx.in | zzx.out |
3 10 5 3 7 | 2 |
【数据范围】
40%数据保证1≤n,m≤1000。
70%数据保证1≤n≤1000,1≤m,a[i]≤10^9。
100%数据保证1≤n≤100000,1≤m,a[i]≤10^9。
分析:
贪心。。sort一波,再按世界少的减毕竟小x太太太强 了~~~
具体看代码:
#include<bits/stdc++.h>
using namespace std;
long long n,i,ans=0,m,a[100002]={};//开longlong 没毛病
inline const long long read()//神奇的快读,这题cin当然也行的了,但所谓快读就是快嘛,保险
{
long long num=0,bj=1;
char x=getchar();
while(x<'0'||x>'9')
{
if(x=='-')bj=-1;
x=getchar();
}
while(x>='0'&&x<='9')
{
num=num*10+x-'0';
x=getchar();
}
return num*bj;
}
int main()
{
freopen("zzx.in","r",stdin);
freopen("zzx.out","w",stdout);
n=read();m=read();
for(i=1;i<=n;i++)
a[i]=read();//快速读入
sort(a+1,a+n+1);//sort又简单又快nlog(n)的速度,这根归并快速是一样的,sort自身就是从小到大
i=1;
while(1)
{
if(m-a[i]>0&&i<=n)//判断行不行
ans++,m-=a[i]; //可以就多一题,且时间变少
else
{
printf("%d",ans);//不行输出
return 0;//跳出
}
++i;//心血来潮,嘿嘿以前都是i++,这次来个++i(当然没什么去别)
}
fclose(stdin);
fclose(stdout);
return 0;
}
第三题
晨跑
(running.cpp/c/pas)
【题目描述】
sw决定每a天晨跑一次。换句话说,假如sw某天早起去跑了步,之后他会休息a-1天,然后第a天继续去晨跑,并以此类推。
sw的好朋友ss和sa深受sw坚持锻炼的鼓舞,并决定自己也要坚持晨跑。ss决定每b天早起跑步一次,而sa决定每c天早起跑步一次。
某天早晨,sw、ss和sa在早起跑步时相遇了,他们非常激动、相互鼓励,共同完成了一次完美的晨跑。
为了表述方便,我们把三位同学相遇的这天记为第0天,他们想知道,下一次三人在跑步时相遇是第几天。由于三位同学都不会算,所以希望由你来告诉他们答案。
【输入格式】
输入文件running.in
输入共一行,包含三个正整数a,b,c,表示sw每隔a天晨跑一次、ss每隔b天晨跑一次且sa每隔c天晨跑一次。
【输出格式】
输出文件running.out
输出共一行,包含一个正整数x,表示三位同学下次将在第x天相遇。
【样例输入】
2 3 5
【样例输出】
30
【数据范围】
对于30%的数据 1<=a,b,c<=100
对于50%的数据 1<=a,b,c<=1000
对于100%的数据 1<=a,b,c<=1000000
分析:
求最小公倍数,但注意的是,这如过*两次会爆longlong 所以选*一个/一个。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef __int64 LL;//其实。。。跟longlong一样大的,但不知道为什么noip不能用。。(so不要学我)
LL a,b,c,k,ans;
LL gcd(LL x,LL y)//gcd来一波 (不会?我只想说~~,百度吧)
{
if(y==0) return x;
else return gcd(y,x%y);
}
int main()
{
freopen("running.in","r",stdin);
freopen("running.out","w",stdout);
scanf("%lld%lld%lld",&a,&b,&c);//不快读了,太恶心,反正就三个数,如果因为输入超时,我TMcs~~
k=gcd(a,b);//先一个gcd
ans=a*b/k;//又*又/。。免得爆longlong
k=gcd(ans,c);//再求 ,把c带上
ans=ans*c/k;// 再来。。。。。
printf("%lld",ans);//输出
fclose(stdin);
fclose(stdout);
return 0;
}
第四题
难题
(zero.pas/c/cpp)
【题目描述】
1×2×3×……×(n-1)×n被称为n的阶乘,记为n!。
一天黄老师上课讲到:求任意一个整数n的阶乘末尾零的个数。
现在你能秒掉么?
【输入文件】(zero.in)
仅一个整数n。
【输出文件】(zero.out)
仅一个整数,即n!末尾零的个数。
【样例输入】
5
【样例输出】
1
【数据规模】
对于30%的数据,n≤20。
对于100%的数据,n在int范围内。
分析:
。。。。没什么可以分析的啊。。。本来还有普及组第二题的难度,但的确讲过,所以,我也不想说什么了,秒掉;
就是用fact~~fact是什么?
n!分解质因数之后,质因子p的重数公式:
[n/p]+[n/p^2]+[n/p^3]+…
也就是
int fact(int n, int p)
{int res=0;
while (n>0) res+=n/=p;
return res;
}
代码:
#include<bits/stdc++.h>
using namespace std;
__int64 n,m,i,k,j;//啊啊啊,不要学啊,用longlong替代了
__int64 fact(__int64 n, __int64 p)//神奇的fact,速度很快的哦!找质因子
{
__int64 res=0;
while (n>0)
res+=n/=p;
return res;
}
int main()
{
freopen("zero.in","r",stdin);
freopen("zero.out","w",stdout);
scanf("%lld",&n);
cout<<fact(n,5);//找5,因为2肯定比5多,想要有0,就要2和5相乘(不要那单独的0给我吐槽)所以选择找5
fclose(stdin);
fclose(stdout);
return 0;
}
————————————————————————结尾线—————————————————————————
啦啦,终于打完了,开心~~
谢谢观赏~~