|_模拟_||_贪心_||_数论_|@普及难度赛@

       集训的第一次考试~~

开心,是AK哦,而且我是最快的!!   啦啦啦阿拉啦啦啦啦~~~~~~~
_______________________________________________________ 线 _______________________________________________________

        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%的数据,nint范围内。

 分析:

。。。。没什么可以分析的啊。。。本来还有普及组第二题的难度,但的确讲过,所以,我也不想说什么了,秒掉;

就是用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;
}


————————————————————————线————————————————————————— 

啦啦,终于打完了,开心~~

谢谢观赏~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值