NEUQ-ACM预备队必做题——第三周

洛谷P1028 [NOIP2001 普及组] 数的计算

思路:

f[n]n的序列方案数字, 那么只需要找到 f[1]~f[n/2] , 因为当前的数 n , 可以在每个 1 ~ n/2 的序列前面加上一个 n 即可, 然后 n 自己也可以是一个序列, 故而可以得到递推式。

代码:

#include <iostream>
using namespace std;
const int N=1010;
int f[N];
int n;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=i/2;j++)
		{
			f[i]+=f[j];
		}
		f[i]++;  
	}
	cout<<f[n];
	return 0;
}

洛谷P1192 台阶问题

思路:

f[i]i个台阶的方案数,将f[i]分为k个情况

  • 最后一步是跨1个台阶,f[i-1]
  • 最后一步是跨2个台阶,f[i-2]
  • 最后一步是跨k个台阶,f[i-k]

注意如果i没有k大时,就不能从1~k,要从1~i

代码:

#include <iostream>
using namespace std;
const int N=1e5+10,mod=100003;
int f[N],n,k;
int main()
{
	cin>>n>>k;
	f[0]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=min(i,k);j++)
		{
			f[i]=(f[i]+f[i-j])%mod;
		}
	}
	cout<<f[n];
	return 0;
}

洛谷P1044 [NOIP2003 普及组] 栈

思路:

这题考的是卡特兰数,我是看y总的讲解之后才懂的,附上y总题解

代码:

#include <iostream>
using namespace std;
typedef long long LL;
const int N=40;
LL c[N][N];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<=2*n;i++)
        for(int j=0;j<=i;j++)
            if(!j)c[i][j]=1;
            else c[i][j]=c[i-1][j-1]+c[i-1][j];
    cout<<c[2*n][n]/(n+1);
    return 0;
}

洛谷P1003 [NOIP2011 提高组] 铺地毯

思路:

这题可以说是暴力枚举,先把所有地毯读入,然后从最后一块地毯可以枚举,判断其是否覆盖了题目中给的坐标,如果是直接输出第几块毛毯,如果最后没有地毯覆盖则输出-1

代码:

#include <iostream>
using namespace std;

const int N=10010;
int n, x[N], y[N], g[N], k[N];

int main()
{
    cin >> n;
    
    for (int i = 0; i < n; i ++ )
    {
        cin >> x[i] >> y[i] >> g[i] >> k[i];
    }
    
    int dx, dy;
    cin >> dx >> dy;
    
    for (int i = n-1; i >= 0; i -- )
    {
        if (x[i] <= dx && y[i] <= dy && x[i]+g[i] >= dx && y[i]+k[i] >= dy)
        {
            cout << i+1 << endl;
            return 0;
        }
    }
    cout << -1 << endl;
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值