CF409F 000001 题解

这是一道CF409F的题目,描述了一个在愚人节推出的极具挑战性的题目,当时仅有几十人成功解决。问题要求根据特定序列输出第i个数,输入为1到64之间的整数i。由于序列未知,唯一的解决方案是通过尝试获取整个序列。该题难度被 luogu 评为 NOI/NOI+~CTSC 水平,第一个AC的选手是NOI级别。代码如下:(省略代码部分)

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一道愚人节的题目。。。据说当时AC只有几十人。。。

题目大意:按某特定序列(我也不知道是什么序列qwq)输出第i个数。

输入:一行,一个数i(1~64)。

输出:一行,特殊序列第i个。

做完我恨不得打死出题人。。。

唯一做法:去卡CF的老爷评测机,获得这个特殊序列所有的数,然后输出。。。(反正我是这么干的。。。)

(luogu给出的评级是NOI/NOI+~CTSC)

第一个AC的NOI嘎哈哈哈哈哈哈

好了上代码

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
#include <ctime>
using namespace std;
int a[105];
void update()
{
    a[1]=1;
    a[2]=1;
    a[3]=1;
    a[4]=2;
    a[5]=1;
    a[6]=2;
    a[7]=1;
    a[8]=5;
    a[9]=2;
    a[10]=2;
    a[11]=1;
    a[12]=5;
    a[13]=1;
    a[14]=2;
    a[15]=1;
    a[16]=14;
    a[17]=1;
    a[18]=5;
    a[19]=1;
    a[20]=5;
    a[21]=2;
    a[22]=2;
    a[23]=1;
    a[24]=15;
    a[25]=2;
    a[26]=2;
    a[27]=5;
    a[28]=4;
    a[29]=1;
    a[30]=4;
    a[31]=1;
    a[32]=51;
    a[33]=1;
    a[34]=2;
    a[35]=1;
    a[36]=14;
    a[37]=1;
    a[38]=2;
    a[39]=2;
    a[40]=14;
    a[41]=1;
    a[42]=6;
    a[43]=1;
    a[44]=4;
    a[45]=2;
    a[46]=2;
    a[47]=1;
    a[48]=52;
    a[49]=2;
    a[50]=5;
    a[51]=1;
    a[52]=5;
    a[53]=1;
    a[54]=15;
    a[55]=2;
    a[56]=13;
    a[57]=2;
    a[58]=2;
    a[59]=1;
    a[60]=13;
    a[61]=1;
    a[62]=2;
    a[63]=4;
    a[64]=267;
}
int main()
{
    int i;
    scanf("%d",&i);
    update();
    printf("%d",a[i]);
    return 0;
}


CF Directional Increase是一道经典的算法题目,通常出现在编程竞赛中。题目要求在一个二维网格中,找到从起点到终点的路径,使得路径上的数值递增。以下是详细的题解: ### 题目描述 给定一个二维网格,每个格子中有一个整数。起点在左上角,终点在右下角。你可以从当前格子移动到右边的格子或下边的格子。找到一条路径,使得路径上的数值递增。 ### 解题思路 1. **动态规划**:使用动态规划来解决问题。定义一个二维数组`dp[i][j]`,表示从起点到格子`(i, j)`的递增路径的长度。 2. **初始化**:起点`dp[0][0]`的值为`grid[0][0]`。 3. **状态转移方程**: - 如果从上方移动到当前格子`(i, j)`,则`dp[i][j] = max(dp[i][j], dp[i-1][j] + 1)`,前提是`grid[i][j] > grid[i-1][j]`。 - 如果从左方移动到当前格子`(i, j)`,则`dp[i][j] = max(dp[i][j], dp[i][j-1] + 1)`,前提是`grid[i][j] > grid[i][j-1]`。 ### 代码实现 ```python def directional_increase(grid): if not grid or not grid[0]: return 0 m, n = len(grid), len(grid[0]) dp = [[1] * n for _ in range(m)] for i in range(m): for j in range(n): if i > 0 and grid[i][j] > grid[i-1][j]: dp[i][j] = max(dp[i][j], dp[i-1][j] + 1) if j > 0 and grid[i][j] > grid[i][j-1]: dp[i][j] = max(dp[i][j], dp[i][j-1] + 1) return dp[m-1][n-1] # 示例 grid = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] print(directional_increase(grid)) # 输出: 5 ``` ### 解释 - 初始化`dp`数组为全1,因为每个格子的递增路径至少为1。 - 遍历每个格子,更新`dp[i][j]`的值。 - 最后,`dp[m-1][n-1]`即为从起点到终点的递增路径的最大长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值