第三周
题解
1. [洛谷P1028] [NOIP2001 普及组] 数的计算
1-1. 题干
1-2. 解析
- 本周学习线性规划,对于该题可用递推但会出现性能问题,应使用线性规划
- 从第一位进行递推,后一位必然包含之前小于其数值上一半的的总和
1-3. 原码
#include <iostream>
using namespace std;
int n, a[1000010];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= (i / 2); j++)
{
a[i] += a[j];
}
a[i]++;
}
cout << a[n] << endl;
return 0;
}
2. [洛谷P1192] 台阶问题
2-1. 题干
2-2. 解析
- 线性规划
- 当n小于等于k时,可以一步跨过所有阶梯,所以需要将a[0]赋值为1
2-3. 原码
#include <iostream>
using namespace std;
int n, k, a[1000010];
int main()
{
cin >> n >> k;
a[0] = 1;
a[1] = 1;
for (int i = 2; i <= n; i++)
{
for (int j = 1; j <= k; j++)
{
if (i >= j)
{
a[i] += a[i - j];
a[i] %= 100003;
}
}
}
cout << a[n] << endl;
return 0;
}
3. [洛谷P1044] [NOIP2003 普及组] 栈
3-1. 题干
3-2. 解析
- 线性规划只是递式比较复杂
- 仅有入栈和出栈两钟操作,且入栈必须先于出栈,所以当入栈操作完成n次之后,剩下的全部为出栈操作
- 在操作数序列全部输入之后,栈和输出序列中的元素数之和必然为n,于是求乘积
3-3. 原码
#include <iostream>
using namespace std;
int n, a[1000010];
int main()
{
cin >> n;
a[0] = 1;
a[1] = 1;
for (int i = 2; i <= n; i++)
{
for (int j = 0; j < i; j++)
{
a[i] += a[j] * a[i - j - 1];
}
}
cout << a[n] << endl;
return 0;
}
4. [洛谷P1003] [NOIP2011 提高组] 铺地毯
4-1. 题干
4-2. 解析
4-3. 原码
#include <iostream>
using namespace std;
struct carpet
{
int a;
int b;
int x;
int y;
} c[100010];
int n, resultx, resulty, result = 0;
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> c[i].a >> c[i].b >> c[i].x >> c[i].y;
}
cin >> resultx >> resulty;
for (int i = 0; i < n; i++)
{
if (resultx >= c[i].a && resultx <= c[i].a + c[i].x && resulty >= c[i].b && resulty <= c[i].b + c[i].y)
{
result = i + 1;
}
}
if (result == 0)
{
cout << "-1" << endl;
}
else
{
cout << result << endl;
}
return 0;
}