暑假集训CSP提高模拟19

暑假集训CSP提高模拟19

\(T1\) P173. 数字三角形 \(20pts\)

  • 原题: CF1517C Fillomino 2
  • 部分分
    • \(20pts\) :剪枝搜索。

      点击查看代码
      int p[510],c[510],ans[510][510],dx[5]={0,1,-1,0,0},dy[5]={0,0,0,-1,1};
      void dfs(int pos,int x,int y,int num,int n)
      {if(pos==n+1){for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cout<<ans[i][j]<<" ";}cout<<endl;}exit(0);}else{if(num==0){dfs(pos+1,pos+1,pos+1,c[pos+1],n);}else{for(int i=1;i<=4;i++){int nx=x+dx[i];int ny=y+dy[i];if(1<=nx&&nx<=n&&1<=ny&&ny<=x&&ans[nx][ny]==0){ans[nx][ny]=p[pos];dfs(pos,nx,ny,num-1,n);ans[nx][ny]=0;}}}}
      }
      int main()
      {int n,i,j;cin>>n;memset(ans,-1,sizeof(ans));for(i=1;i<=n;i++){cin>>p[i];ans[i][i]=p[i];		c[i]=p[i]-1;}for(i=1;i<=n;i++){for(j=1;j<=i-1;j++){ans[i][j]=0;}}dfs(1,1,1,c[1],n);return 0;
      }
      
  • 正解
    • 通过打表,我们可以发现合法方案中同一个数向右延伸一定不优,向左延伸比向下延伸更优。

    • 所以填数时优先向左延伸,否则向下延伸。

      点击查看代码
      int p[510],c[510],ans[510][510];
      void dfs(int pos,int x,int y,int num,int n)
      {if(pos==n+1){for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cout<<ans[i][j]<<" ";}cout<<endl;}exit(0);}else{if(num==0){dfs(pos+1,pos+1,pos+1,c[pos+1],n);}else{if(y-1>=1&&ans[x][y-1]==0){ans[x][y-1]=p[pos];dfs(pos,x,y-1,num-1,n);}else{if(x+1<=n&&ans[x+1][y]==0){ans[x+1][y]=p[pos];dfs(pos,x+1,y,num-1,n);}}}}
      }
      int main()
      {int n,i;cin>>n;for(i=1;i<=n;i++){cin>>p[i];ans[i][i]=p[i];		c[i]=p[i]-1;}dfs(1,1,1,c[1],n);return 0;
      }
      

\(T2\) P160. 那一天她离我而去 \(0pts\)

  • 部分分
    • \(76pts\)\(Dijkstra\) 求解最小环。
      • 枚举 \(1\) 的所有出边,钦定这条边是环上的边,删掉这条边后再求到这个点的最短路长度,加上被删的边的长度与答案取 \(\min\) 即可。

      • 若不限制起点,则需要枚举边 \((u,v,w) \in E\) ,删掉这条边后 \(u \to v\) 的最短路长度 \(+w\) 与答案取 \(\min\) 即可。时间复杂度为 \(O(m(n+m)\log n)\)

        点击查看代码
        struct node
        {int nxt,to,w;
        }e[80010];
        int head[10010],vis[10010],dis[10010],brokeu,brokev,cnt=0;
        vector<pair<int,int> >broke;
        void add(int u,int v,int w)
        {cnt++;e[cnt].nxt=head[u];e[cnt].to=v;e[cnt].w=w;head[u]=cnt;
        }
        bool check(int u,int v)
        {return ((u==brokeu&&v==brokev)||(u==brokev&&v==brokeu));
        }
        void dijkstra(int s)
        {memset(dis,0x3f,sizeof(dis));memset(vis,0,sizeof(vis));priority_queue<pair<int,int> >q;dis[s]=0;q.push(make_pair(-dis[s],-s));while(q.empty()==0){int x=-q.top().second;q.pop();if(vis[x]==0){vis[x]=1;for(int i=head[x];i!=0;i=e[i].nxt){if(check(x,e[i].to)==0&&dis[e[i].to]>dis[x]+e[i].w){dis[e[i].to]=dis[x]+e[i].w;q.push(make_pair(-dis[e[i].to],-e[i].to));}}}}
        }
        int main()
        {int t,n,m,ans,u,v,w,i,j;cin>>t;for(j=1;j<=t;j++){cnt=0;ans=0x7f7f7f7f;broke.clear();memset(e,0,sizeof(e));memset(head,0,sizeof(head));cin>>n>>m;for(i=1;i<=m;i++){cin>>u>>v>>w;add(u,v,w);add(v,u,w);if(u==1){broke.push_back(make_pair(v,w));}if(v==1){broke.push_back(make_pair(u,w));}}for(i=0;i<broke.size();i++){brokeu=1;brokev=broke[i].first;dijkstra(1);if(dis[brokev]!=0x3f3f3f3f){ans=min(ans,dis[brokev]+broke[i].second);}}cout<<(ans>=0x7f7f7f7f?-1:ans)<<endl;}return 0;
        }
        
  • 正解

\(T3\) P175. 哪一天她能重回我身边 \(20pts\)

  • 部分分
    • \(20pts\) :剪枝搜索。

      点击查看代码
      const ll p=998244353;
      ll x[100010],y[100010],cnt[200010],ans,sum;
      void dfs(ll pos,ll num,ll n)
      {if(pos==n+1){if(num<ans){ans=num;sum=1;}else{if(num==ans){sum=(sum+1)%p;}}}else{cnt[x[pos]]++;if(cnt[x[pos]]==1){dfs(pos+1,num,n);}cnt[x[pos]]--;cnt[y[pos]]++;if(cnt[y[pos]]==1){dfs(pos+1,num+1,n);}cnt[y[pos]]--;}
      }
      int main()
      {ll t,n,i,j;cin>>t;for(j=1;j<=t;j++){cin>>n;for(i=1;i<=n;i++){cin>>x[i]>>y[i];}ans=0x7f7f7f7f;sum=0;dfs(1,0,n);if(ans==0x7f7f7f7f){cout<<"-1 -1"<<endl;}else{cout<<ans<<" "<<sum<<endl;}}return 0;
      }
      
  • 正解

\(T4\) P174. 单调区间 \(60pts\)

  • 原题: CF1693D Decinc Dividing
  • 部分分
    • \(60pts\)\(O(n^{2})\) 枚举左右端点,剪枝搜索判断合不合法。

      点击查看代码
      ll a[200010],b[200010];
      vector<ll>s1,s2;
      bool dfs(ll pos,ll n)
      {if(pos==n+1){return true;}else{ll flag=0;if(s1.size()==0||s1[s1.size()-1]>b[pos]){s1.push_back(b[pos]);flag|=dfs(pos+1,n);s1.pop_back();}if(s2.size()==0||s2[s2.size()-1]<b[pos]){s2.push_back(b[pos]);flag|=dfs(pos+1,n);s2.pop_back();}return flag;}
      }
      bool check(ll l,ll r)
      {for(ll i=l;i<=r;i++){b[i-l+1]=a[i];}return dfs(1,r-l+1);
      }
      int main()
      {ll n,ans=0,i,j;cin>>n;for(i=1;i<=n;i++){cin>>a[i];}for(i=1;i<=n;i++){for(j=i;j<=n;j++){ans+=check(i,j);}}cout<<ans<<endl;return 0;
      }
      
  • 正解

总结

  • \(T1\) 赛时把结论猜出来后一直在想怎么处理边界和怎么进行 \(hack\) ,到最后也没打代码。
  • \(T2\) 因为提交前忘再编译一遍了,把分号打成了冒号,因 \(CE\) 挂了 \(23pts\) ;因为知道是板子,但自己没学所以干脆没去想 \(Dijkstra\) 怎么求解最小环,可能是学的东西太多了导致的?

后记

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/781813.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法学习】排序算法汇总

冒泡排序 1、冒泡排序简介冒泡排序的英文Bubble Sort,是一种最基础的交换排序。之所以叫做冒泡排序,因为每一个元素都可以像小气泡一样,根据自身大小一点一点向数组的一侧移动冒泡排序的原理:冒泡轮数:每一轮只能将该轮中最大的数排至最后面。即第一轮只能确定将末位上的数…

安装local-path-provisioner基于HostPath动态制备PV

目录一、背景二、安装local-path-provisioner1、地址2、更改 local-path-provisioner 使用的默认存储路径3、创建文件并提权4、创建 NameSpace5、应用 local-path-storage6、验证相关资源状态三、设置 local-path 为default SC四、使用 StorageClass 动态制备 PV1、创建PVC2、创…

CogVideoX环境搭建推理测试

​引子 智谱AI版Sora开源,首个可商用,18G显存即可运行。前文写了Open-Sora1.2的博文,感兴趣的童鞋请移步(Open-Sora1.2环境搭建&推理测试_open sora 1.2-CSDN博客)。对于这种占用资源少,且效果不错的多模态模型那么肯定不容错过。OK,我们开始吧。 一、模型介绍 CogV…

【Linux学习】Ubuntu配置

1、如何在Ubuntu18.04上面安装VMware-tools实现屏幕适配,以及文件拖拽、复制、粘贴功能 先设置以下:此处一定要设置路径保证客户机隔离选项两个勾选将主机桌面文件夹设置为共享 点击VMware顶部菜单,“虚拟机” > “安装VMware Tools”,桌面会出现光盘图标“VMware Tools…

使用 OpenSSH 登录远程服务器

打开开始菜单进入设置界面,搜索“可选功能”,点击“添加可选功能”,查找“OpenSSH” 找到这两个安装 安装成功后以管理员方式打开Windows PowerShell 输入命令 Start-Service sshd ssh user@example.com user 是远程服务器的用户名,example.com 是远程服务器的域名或 IP …

【算法学习】算法时间复杂度

时间复杂度的计算 时间复杂度简单计算(一层、两层、多层循环) 相当于轨迹追踪法:设执行次数为k,按照循环条件阿布算法课学习链接01 区别算法(Algorithm)和程序(Program)算法程序设计阶段 实施阶段相关领域知识 程序员任何语言、伪代码 编程语言独立于硬件/操作系统 与硬件/…

《数据资产管理核心技术与应用》读书笔记-第三章:数据血缘

数据资产管理核心技术与应用《数据资产管理核心技术与应用》是清华大学出版社出版的一本图书,全书共分10章,第1章主要让读者认识数据资产,了解数据资产相关的基础概念,以及数据资产的发展情况。第2~8章主要介绍大数据时代数据资产管理所涉及的核心技术,内容包括元数据的采…

【办公软件学习】如何交叉引用多个参考文献[x-x]

参考文献 第一步:点击交叉引用将[24]、[27]这两个文献插入。 第二步:右键刚插入的文献序号,然后点击切换域代码 第三步:在代码块中添加代码\#"[0"和\#"0]"第四步:右键刚编辑的代码块,并更新域。 第五步:在[4547]之间添加-,之后按"ctrl"+…

【办公软件学习】如何将Word格式转换为Markdown格式

一键!将 Word 转换为 Markdown 参考链接1:https://zhuanlan.zhihu.com/p/30891168 参考链接2:https://blog.csdn.net/qq15035899256/article/details/125547483 参考链接3:https://word2md.com/ 方法一:Writage + Pandoc — 双剑合璧!下载并安装 Writage,下载地址:http…

全连接层详解

全连接层详解 该博客仅是笔者对于全连接层的浅薄理解。如果存在问题,请务必告知我,谢谢。 前言 全连接层是常见的神经网络层,可以作为模型的分类器(可理解为将特征维度映射到类别维度上),也可以作为特征提取。不过,对于初学者,可以直接认为全连接层是模型的分类器。毕竟…

[Java/SQL] 自动去除SQL注释

0 引言 在数据连接(池)框架、数据服务/Data to API等中间平台中,因部分数据库不允许SQL中存在注释信息(如:Redis、Open Gemini等;当然,MYSQL、INFLUXDB等数据库是支持的),故存在这样一个需求:在提交到数据库的SQL,需对原始SQL的注释信息予以去除。以 OpenGemini V1.2.…

Java基础-学习笔记08

类变量、类方法、main方法、代码块01 类变量、类方法、main方法、代码块 类变量(静态变量) 类变量也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量。关于静态变…