Codeforces Round #166 (Div. 2)

本文回顾了一场比赛经历,分享了解决方案,包括通过预处理找到最近素数的算法实现,解决矩阵元素问题;讨论了如何避免形成等差数列的策略;并介绍了构建字典树的方法来处理字符串数据。

p.s.这场比赛题目都还挺好的我觉得,但还是做跪了,要是没那4个hack的话就死了...

A.略

B.解法:可以直接预处理出来距离每个数最近的素数,然后加一遍。当然也可以打个素数表然后二分。

我的二分写法
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<iostream>
 5 #define N 1000010
 6 using namespace std;
 7 bool p[N];
 8 int s[N];
 9 int x[1010][1010];
10 int r[N],c[N];
11 void init(){
12     memset(p,1,sizeof(p));
13     for(int i=2;i*i<N;i++)
14         for(int j=i;i*j<N;j++)
15             p[i*j]=0;
16     s[0]=0;
17     for(int i=2;i<N;i++)
18         if(p[i])s[++s[0]]=i;
19 }
20 int solve(int x){
21     int pos=lower_bound(s+1,s+1+s[0],x)-s;
22     return s[pos]-x;
23 }
24 int main(){
25     int n,m;
26     init();
27     while(cin>>n>>m){
28         memset(r,0,sizeof(r));
29         memset(c,0,sizeof(c));
30         for(int i=1;i<=n;i++){
31             for(int j=1;j<=m;j++){
32                 cin>>x[i][j];
33                 r[i]+=solve(x[i][j]);
34                 c[j]+=solve(x[i][j]);
35             }
36         }
37         int ans=1<<30;
38         for(int i=1;i<=n;i++)ans=min(ans,r[i]);
39         for(int j=1;j<=m;j++)ans=min(ans,c[j]);
40         cout<<ans<<endl;
41     }
42     return 0;
43 }

C.只要集合里的数不是等差数列就行了,我们可以每k个分个段,然后分配到各个集合,这样的话每个集合都是等差数列,我们把数列最后1或2项改一下就行

View Code

D.构建字典树,一直向字典树中插入就行,O(n^2).貌似存在卡字符串哈希的算法,有待研究。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define N 1510
 5 using namespace std;
 6 char s[N];
 7 int x[26];
 8 int trie[N*N][26];
 9 int cnt,root;
10 int maxn;
11 int main(){
12     while(~scanf("%s",s)){
13         int n=strlen(s);
14         for(int i=0;i<26;i++){
15             scanf("%1d",&x[i]);
16             x[i]^=1;
17         }
18         scanf("%d",&maxn);
19         memset(trie,-1,sizeof(trie));
20         cnt=0;
21         int ans=0;
22         for(int i=0;i<n;i++){
23             int p=0,num=0;
24             for(int j=i;j<n;j++){
25                 int id=s[j]-'a';
26                 num+=x[id];
27                 if(num>maxn){
28                     break;
29                 }
30                 if(trie[p][id]==-1){
31                     ans++;
32                     trie[p][id]=++cnt;
33                 }
34                 p=trie[p][id];
35             }
36         }
37         printf("%d\n",ans);
38     }
39     return 0;
40 }

 

 

 

转载于:https://www.cnblogs.com/silver-bullet/archive/2013/02/12/2910382.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值