[Offer收割]编程练习赛64

本文精选了四种不同的算法问题:公平划分中的异或和判断、配对问题的高效解决、字符串处理中的二分查找应用以及公共山峰问题的状态细化方法。通过实际代码示例,深入解析了每种问题的解决方案及关键步骤。

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

公平划分

判断异或和是否为0

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int main() {
 5     int n, sum = 0, x;
 6     scanf("%d", &n);
 7     for(int i = 1; i <= n; ++i) scanf("%d", &x), sum ^= x;
 8     if(sum) puts("0");
 9     else printf("%lld\n", (1LL << n) - 2);
10     return 0;
11 }
Aguin

 

配对

排序扫一遍

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int A[22], B[22];

int main() {
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", A + i);
    for(int i = 1; i <= n; ++i) scanf("%d", B + i);
    sort(A + 1, A + 1 + n);
    sort(B + 1, B + 1 + n);
    LL ans = 1, p = 0;
    for(int i = 1; i <= n; ++i) {
        while(p < n && A[p+1] <= B[i]) ++p;
        ans *= (p - i + 1);
    }
    printf("%lld\n", ans);
    return 0;
}
Aguin

 

字符串问题

每次尽量多加 二分找位置

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 1e5 + 10;
 4 vector<int> nxt[26], add[26];
 5 char s[maxn];
 6 
 7 int main() {
 8     scanf("%s", s + 1);
 9     int len = strlen(s + 1), ans = 0, o = 0;
10     while(o < len) {
11         ans++;
12         int p = 0;
13         while(o < len) {
14             int x = s[o+1] - 'a';
15             int np = upper_bound(nxt[x].begin(), nxt[x].end(), p) - nxt[x].begin();
16             if(np == nxt[x].size()) break;
17             o++, p = nxt[x][np], add[x].push_back(o);
18         }
19         if(p == 0) o++, add[s[o]-'a'].push_back(o);
20         for(int i = 0; i < 26; ++i) {
21             for(int j = 0; j < add[i].size(); ++j) nxt[i].push_back(add[i][j]);
22             add[i].clear();
23         }
24     }
25     printf("%d\n", ans);
26     return 0;
27 }
Aguin

 

公共山峰

复习一下状态细化,就是把走$i$和走$j$分成两步走

$f[i][j][0/1][0/1]$表示考虑到($i$,$j$)位置,最后一段递增/递减,最后一步走的是$j$/$i$的最大值

当满足$x[i] = y[j]$时,有$f[i][j][0][0] = \max \limits_{0 \leq k \leq j - 1} \{ f[i][k][0][1] \}$, 这个前缀最大值可以用一个滚动数组维护

类似的,当满足$x[i] > y[j]$时,有$f[i][j][0][1] = \max \limits_{0 \leq k \leq i - 1} \{ f[k][j][1][0] \}$

还有两种转移也是一样的

注意初始化的情况

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 2005;
 4 int f[maxn][maxn][2][2];
 5 int MX[maxn][2], MY[maxn][2];
 6 int x[maxn], y[maxn];
 7 
 8 int main() {
 9     int nx, ny, ans = 0;
10     scanf("%d", &nx);
11     for(int i = 1; i <= nx; ++i) scanf("%d", x + i);
12     scanf("%d", &ny);
13     for(int i = 1; i <= ny; ++i) scanf("%d", y + i);
14     for(int i = 1; i <= nx; ++i) {
15         for(int j = 1; j <= ny; ++j) {
16             if(x[i] == y[j]) f[i][j][0][0] = max(1, MX[i][0]);
17             if(x[i] > y[j]) f[i][j][0][1] = MY[j][1] + 1;
18             if(x[i] == y[j]) f[i][j][1][0] = max(1, MX[i][1]);
19             if(x[i] < y[j]) f[i][j][1][1] = MY[j][0] + 1;
20             MX[i][0] = max(MX[i][0], f[i][j][0][1]);
21             MX[i][1] = max(MX[i][1], f[i][j][1][1]);
22             MY[j][0] = max(MY[j][0], f[i][j][0][0]);
23             MY[j][1] = max(MY[j][1], f[i][j][1][0]);
24             ans = max(ans, max(f[i][j][1][0], f[i][j][0][0]));
25         }
26     }
27     printf("%d\n", ans);
28     return 0;
29 }
Aguin

还有严格按照题意的话可能要考虑只有两个数且相等的情况但是好像没有这种数据来卡我

 

转载于:https://www.cnblogs.com/Aguin/p/9194051.html

内容概要:本文介绍了奕斯伟科技集团基于RISC-V架构开发的EAM2011芯片及其应用研究。EAM2011是一款高性能实时控制芯片,支持160MHz主频和AI算法,符合汽车电子AEC-Q100 Grade 2和ASIL-B安全标准。文章详细描述了芯片的关键特性、配套软件开发套件(SDK)和集成开发环境(IDE),以及基于该芯片的ESWINEBP3901开发板的硬件资源和接口配置。文中提供了详细的代码示例,涵盖时钟配置、GPIO控制、ADC采样、CAN通信、PWM输出及RTOS任务创建等功能实现。此外,还介绍了硬件申领流程、技术资料获取渠道及开发建议,帮助开发者高效启动基于EAM2011芯片的开发工作。 适合人群:具备嵌入式系统开发经验的研发人员,特别是对RISC-V架构感兴趣的工程师和技术爱好者。 使用场景及目标:①了解EAM2011芯片的特性和应用场景,如智能汽车、智能家居和工业控制;②掌握基于EAM2011芯片的开发板和芯片的硬件资源和接口配置;③学习如何实现基本的外设驱动,如GPIO、ADC、CAN、PWM等;④通过RTOS任务创建示例,理解多任务处理和实时系统的实现。 其他说明:开发者可以根据实际需求扩展这些基础功能。建议优先掌握《EAM2011参考手册》中的关键外设寄存器配置方法,这对底层驱动开发至关重要。同时,注意硬件申领的时效性和替代方案,确保开发工作的顺利进行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值