HL第二次考试

这次的考试题很水,有很多人AK了,但我还是没AK…


回到正文
##第一题
cz找了一串只由小写字母组成的序列,每次他将提问ltz某个小写字母第k次出现的位置,假如全对,输出AK,否则输出错误的次数

预处理一遍每个字母第k次出现的位置,然后直接输出

#include<bits/stdc++.h>
using namespace std;
int a[30][50100]={};
int b[30]={};
int n,m;
int ans=0; 
inline int read()//快读,很快
{
	int x=0,w=0;char ch=0;
	while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
	while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	return w?-x:x;
} 

int main()
{
	freopen("index.in","r",stdin);
	freopen("index.out","w",stdout);
	n=read();
	m=read();
	for (int i=1;i<=n;i++)
	  {
	  	char ch;
	  	ch=read();
	  	a[ch-'a'][++b[ch-'a']]=i;//预处理一遍
	  	//cout<<ch<<' '<<b[ch-'a']<<' '<<a[ch-'a'][b[ch-'a']]<<endl;
	  }
	for (int i=1;i<=m;i++)
	  {
	  	char ch;
	  	int x,y;
	  	ch=read();
	  	x=read();
	  	y=read();
	  	int z=ch-'a';
	  	if (a[z][x]!=y)//直接判断
	  	  ans++;
	  } 
	if (ans==0)//全对
	  cout<<"AK"<<endl;
	else
	  cout<<ans<<endl;
	return 0;
	fclose(stdin);
	fclose(stdout);
}

第一遍时最后两个点超时,加个快读就好了
##第二题
输入n个题目,每个题目需a[i]秒,总共m秒,最多能做几题

最纯的贪心,相比智力大冲浪还要多一个条件

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100100]={};
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 (int i=1;i<=n;i++)
	  {
	  	m-=a[i];
	  	if (m<0)
	  	  break;
	  	ans++;
	  }
	cout<<ans<<endl;
	fclose(stdin);
	fclose(stdout);
	return 0;
}  

##第三题
最简化版:输出a,b,c的最小公倍数

多说无益

#include<bits/stdc++.h>
using namespace std;
int a,b,c;
inline unsigned long long gcd(unsigned long long a,unsigned long long b)
{
	if (a%b==0)
	  return b;
	else
	  return gcd(b,a%b);
}
unsigned long long lcm (unsigned long long a,unsigned long long b)
{
	return (a*b/gcd(a,b));
}
int main()
{
	freopen("running.in","r",stdin);
	freopen("running.out","w",stdout);
	cin>>a>>b>>c;
	cout<<lcm(lcm(a,b),c)<<endl;
	fclose(stdin);
	fclose(stdout);
	return 0; 
}

因为最小公倍数会爆炸,爆掉long long,所以要用unsigned long long,也可以在lcm函数里先除再乘,就不会爆了
看着unsigned long long很恶心的可以用#define(滑稽)
##第四题
计算n的阶乘里末尾有几个0

10的因数是2和5,因为2的个数比5多得多,所以只要计算n的阶乘里有几个5的倍数就行了

#include<bits/stdc++.h>
using namespace std;
long long ans=0;
int n;
int main()
{
	freopen("zero.in","r",stdin);
	freopen("zero.out","w",stdout);
	cin>>n;
	for (int i=5;i<=n;i*=5)
	  ans+=n/i;
	cout<<ans<<endl;
	fclose(stdin);
	fclose(stdout);
	return 0;
}

博客结束

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值