HL第三次考试

这次…怎么说呢,快倒数了,但获得了一个定理:暴力可能不会TLE,会MLE,会更惨,暴力优化多好都是0分…不亏不亏


##第一题
某位蒟蒻带着n个山楂(cha)路过,碰见m个大佬,每个大佬都会敲诈他手中一半的山楂(cha),向下取整,并因为可怜他还他一个,问到最后还有几个山楂(cha)
数据范围:n<=1*107,M<=2*109

简化:给定一个数n,经过m次操作后还剩多少,操作为除2加一,除法向下取整,也就是去掉小数部分

TIPS:假如只这样的话,根据数据会T掉部分,所以要加上优化
因为m的范围比n大得多,所以到后面n的值就会变成2或3,并不断执行,这样会造成很多的重复操作,所以要特判一下

#include<bits/stdc++.h>
using namespace std;
int n,m;
int main()
{
	freopen("station.in","r",stdin);
	freopen("station.out","w",stdout);
	cin>>m>>n;
	for (int i=1;i<=n;i++)
	  {
	  	m-=m/2;
		m++;
		if (m==2||m==3)//特判
		  break; 
	  } 
	cout<<m<<endl;
	return 0;
}

##第二题
要跳n级楼梯,跳到偶数级时,可以选择跳2级或3级;跳到奇数级时,可以选择跳1级或,4级问跳n级的方案数,初始为0级(偶数级)
由于计算出来的数可能过大,所以要对1*10^9+7取模

递推,很朴素

代码实现,对1*10^9+9取模,很朴素

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1000000007;
int n;
int a[50001000];
int main()
{
	freopen("stairs.in","r",stdin);
	freopen("stairs.out","w",stdout);
	cin>>n;
	a[0]=1;
	a[1]=0;
	for (int i=0;i<=n;i++)
	  if (i%2==0)
	    a[i+2]=(a[i+2]+a[i])%MAXN,a[i+3]=(a[i+3]+a[i])%MAXN;
	  else
	    a[i+1]=(a[i+1]+a[i])%MAXN,a[i+4]=(a[i+4]+a[i])%MAXN;
	cout<<a[n]<<endl;
	return 0;
} 

##第三题
有一只猫,它的基因由三种字符’c’,‘a’,‘t’组成,每过一个单位时间,就会复制一遍基因,并在中间加上t-1个’a’(t为过了几个单位时间),问第i位的基因是什么
大致如此
当t=1,为"cat"
当t=2,为"cat a cat"
当t=3,为"catacat aa catacat"

分治题,很容易得出t=n时的基因数量为f[n]=f[n-1]*2+(t-1) (f[1]=3),也就可以对那一串基因进行递归求解
也把基因分为以上三种状态,黑色的前半部分,红色的中间一串’a’,蓝色的后半部分
假如递归到中间的一串’a’那么就直接输出’a’,结束,美滋滋
因为后半部分等于前半部分,所以如果递归到后半部分字母时就等于等量代换到前面半部分的字母,那么就再次对前半部分进行递归

代码片找不到了,所以也就将就着,想要看代码片参照一位大佬的博客:点击这里
##第四题
你要分m个果子,现在有n个人,保证每人都有果子,有多少种分法
注意:假如有2人3果,1 2和2 1是同一种方案

因为要保证每个人都有果子,所以先每个人给一个果子,再进行递归

直接给出代码片

#include<bits/stdc++.h>
using namespace std;
int n,m;
inline int dfs(int x,int y)//x个果子分给y个人的方案数
{
	if (x<=1||y<=1)//果子只有一个或人只有一个
	  return 1;//只能有一个方案数
	else
	  if (x<y)//果子比人少
	    return dfs(x,x);//最多只能分给x个人,所以和x人的方案数一样
	  else 
	    if (x==y)//果子和人一样
	      return dfs(x,x-1)+1;//让一个人不拿就会变成人数差1的方案,否则方案数多了一个	    
	    else//果子比人多
	      return dfs(x,y-1)+dfs(x-y,y);//让一个人不拿或每人拿一个
}
int main()
{
	freopen("monkey.in","r",stdin);
	freopen("monkey.out","w",stdout);
	cin>>n>>m;
	n-=m;//每人先给一个
	cout<<dfs(n,m)<<endl; 
	return 0;
} 

最后一题么,emmmmm,是一道求区间最值问题,要用RMQ算法,至今还不知道怎么做,所以就不发了哈哈


这次的博客正式结束

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值