选数-做题报告

1|0P1036选数

1|1这是第三次写报告了,这几天一直在刷之前抄题解过的题(再次感谢kkk知道),这道题我到最终都没想出来,一直卡在判重这个地方。。。

2|0不说了,给下这几次为了判重写的鸡肋代码

3|0number 1

#include<bits/stdc++.h> using namespace std; int a[100000],ans; int n,m; bool vis[1000000]; vector<int> s; inline bool pd(int a) { for(int i=2;i<=sqrt(a);i++) { if(a%i==0)return 0; } return 1; } inline int dfs(int sum,int num) { if(sum==m&&pd(num)) { vector<int>::iterator ss=find(s.begin( ), s.end( ),num); if(ss==s.end()) { s.push_back(num); ans++; } } for(int i=1;i<=n;i++) { if(!vis[a[i]]) { vis[a[i]]=1; dfs(sum+1,num+a[i]); vis[a[i]]=0; } } } int main() { ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } dfs(0,0); cout<<ans; }

3|1这个就没什么好说的,题目都理解错了,不是答案要判重,而是计算时的加数要判重啊啊啊啊

4|0number 2

#include<bits/stdc++.h> using namespace std; int a[100000],ans; int n,m; bool vis[1000000]; struct xxx{ int x[100000],y; }s[100000],node; int o; int p=0; inline bool pd(int a) { for(int i=2;i<=sqrt(a);i++) { if(a%i==0)return 0; } return 1; } inline bool pd3(xxx a,xxx b) { for(int i=0;i<p;i++) { if(a.x[i]!=b.x[i])return 1; } return 0; } inline bool pd2(xxx a) { for(int i=1;i<=o;i++) { if(s[i].y==a.y&&!pd3(s[i],a))return 0; } return 1; } inline int dfs(int sum,int num) { if(sum==m&&pd(num)) { node.y=num; if(pd2(node)) { ans++; o++; p=0; s[o]=node; } } for(int i=1;i<=n;i++) { if(!vis[i]) { vis[i]=1; s[o].x[p++]; dfs(sum+1,num+a[i]); s[o].x[p]=0; vis[i]=0; } } } int main() { ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } dfs(0,0); cout<<ans; }

4|1十分无脑地把每个加数都做了判断。。。写到后面帆哥一直在吵,崩了。。。

5|0我决定了,看题解!

5|1于是我发现。,其实判重的话根本不需要,是因为睿智的我每次递归搜索后循环中的i都是有从零开始算了,这样不重复才怪啊!!!

6|0number 3 (AC) 码

#include<bits/stdc++.h> using namespace std; int a[100000],ans; int n,m; bool vis[1000000]; vector<int> s; inline bool pd(int a) { for(int i=2;i<=sqrt(a);i++) { if(a%i==0)return 0; } return 1; } inline int dfs(int sum,int num,int ki) { if(sum==m&&pd(num)) { ans++; } for(int i=ki;i<=n;i++) { if(!vis[i]) { vis[i]=1; dfs(sum+1,num+a[i],i+1); vis[i]=0; } } } int main() { ios::sync_with_stdio(false); cin>>n>>m; for(int i=1;i<=n;i++) { cin>>a[i]; } dfs(0,0,1); cout<<ans; }

7|0在机房发的嘿嘿,不说了拉屎去了


__EOF__

本文作者Kdlyh
本文链接https://www.cnblogs.com/kdlyh/p/17777018.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   加固文明幻景  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示