当前位置: 首页 > news >正文

福州市 2025 国庆集训 Day1 前三题题解

福州市 2025 国庆集训 Day1 前三题题解

别问为啥只有前三题,因为后面我不会……

Day1 题单

T1 旅行

传送门

注意到 \(P\) 非常小,所以可以考虑指数级别的做法。

考虑状压 dp。设 \(f_{s,u}\) 表示经过 \(P\) 内的点集为 \(s\),当前位于 \(P\) 中第 \(u\) 号点的最短路径长度。

然而我们的路径其实是 \(1\rightarrow p_1\rightarrow \cdots \rightarrow p_n\rightarrow n\),所以其实点集的级别是 \(2^{p+2}\)

那么转移就是枚举 \(s\),然后枚举 \(s\) 内经过的点 \(i\),再枚举 \(s\) 内没经过的点 \(j\),得到新的状态 s'=s|(1<<j)

然后 \(f_{s',j}=\min \left\{f_{s,i}+dis_{p_i,p_j}\right\}\)。其中 \(dis_{p_i,p_j}\) 表示点 \(p_i\) 到点 \(p_j\) 的最短路径长度。可以用 Floyd 预处理出来。

最后的答案显然就是 \(f_{2^{p+2}-1,p+1}\)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ljl;
const int N=205,M=1e4+5,P=15;
const ljl inf=1e18;
int n,m,p,vec[N],cur=1;
ljl dis[N][N],ans,f[(1<<P)+5][N];
bool vis[N];
int main(){ios::sync_with_stdio(0);cin>>n>>m;for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)if(i!=j)dis[i][j]=inf;for(int i=1;i<=m;++i){ljl u,v,w;cin>>u>>v>>w;dis[u][v]=dis[v][u]=min(dis[u][v],w);}cin>>p;for(int i=1;i<=p;++i){cin>>vec[i];vis[vec[i]]=1;}vec[0]=1;vec[p+1]=n;for(int k=1;k<=n;++k)for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);memset(f,0x3f,sizeof(f));f[1][0]=0;for(int i=0;i<(1<<p+2);++i){for(int j=0;j<p+2;++j){if(!((i>>j)&1))continue;for(int k=0;k<p+2;++k){if((i>>k)&1)continue;f[i|(1<<k)][k]=min(f[i|(1<<k)][k],f[i][j]+dis[vec[j]][vec[k]]);}}}ans=f[(1<<p+2)-1][p+1];if(ans>=inf)cout<<-1<<'\n';else cout<<ans<<'\n';return 0;
}

T2 种植

传送门

先看看如果不考虑 \(q_i\),那么就是个简单的 01 背包板子。

但是它有 \(q_i\) 啊?

我们可以尝试下,发现把 \(q_i\) 按照从大到小的顺序排序后依次插入是最优的。

证明听了,但不会。/kel。只懂把某个时间段移到前面,与前面的交换,则前面的也一定可以对答案做出贡献。所以不会更劣

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=305,T=2e4+5;
int n,t,f[T],ans;
struct NODE{int p,q,r;bool operator < (const NODE x)const{return q>x.q;}
}node[N];
int main(){ios::sync_with_stdio(0);cin>>n>>t;for(int i=1;i<=n;++i)cin>>node[i].p>>node[i].q>>node[i].r;sort(node+1,node+n+1);for(int i=1;i<=n;++i){for(int j=t-node[i].q;j>=node[i].p;--j){f[j]=max(f[j],f[j-node[i].p]+node[i].r);}}for(int i=1;i<=t;++i)ans=max(ans,f[i]);cout<<ans<<'\n';return 0;
}

T3 最短路

题目传送门

妙妙题。

考虑额外加边的本质是什么。

通过 T1,不难想到其实就是把数字化作二进制,看成集合,\(i\) 可以向 \(j\) 连边当且仅当 \(j\)\(i\) 的真子集。

那么考虑怎么优化建图。

比如说当前数字为 \((101)_2\),那么可以 \((101)_2\rightarrow (100)_2\),以及 \((101)_2\rightarrow (001)_2\)。其中边权均为 \(0\)

那么就有问题了:正常来说边权是 \(1\) 啊?

其实这些点都是虚图。点编号是从 \(n+1\) 开始的。

所以我们就建好了图。

注意,这样的话,需要开的点的大小是 \(2\times 10^5+2^{20}\),边是 \(3\times 10^5+2^{20}\times 20\)

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+(1<<20)+5,M=3e5+(1<<20)*20+5;
int n,m,a[N],ehead[N],cnt_e,dis[N],maxa;
bool vis[N];
struct E{int to,w,pre;
}e[M];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > h;
void adde(int from,int to,int w)
{e[++cnt_e].to=to;e[cnt_e].w=w;e[cnt_e].pre=ehead[from];ehead[from]=cnt_e;return;
}
void dijk()
{memset(dis,0x3f,sizeof(dis));dis[1]=0;h.push(make_pair(dis[1],1));while(!h.empty()){int u=h.top().second;h.pop();if(vis[u])continue;vis[u]=1;for(int i=ehead[u];i;i=e[i].pre){int v=e[i].to,w=e[i].w;if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;if(!vis[v])h.push(make_pair(dis[v],v));}}}return;
}
int main(){ios::sync_with_stdio(0);cin>>n>>m;for(int i=1;i<=n;++i)cin>>a[i];for(int i=1,u,v;i<=m;++i){cin>>u>>v;adde(u,v,1);}for(int i=1;i<=n;++i)adde(i,n+a[i]+1,0),adde(n+a[i]+1,i,1),maxa=max(maxa,a[i]);for(int i=1;i<=maxa;++i)//set i{//set i->set j(j\in i)for(int j=0;j<20;++j){if((i>>j)&1)adde(n+i+1,n+(i^(1<<j))+1,0);}}dijk();for(int i=1;i<=n;++i)cout<<(dis[i]==0x3f3f3f3f?-1:dis[i])<<'\n';return 0;
}
http://www.hskmm.com/?act=detail&tid=22326

相关文章:

  • Python常用数据类型详解:字符串、列表、字典全解析
  • 强连通,Tarjan,缩点
  • OI 笑传 #13
  • Python方案--交互式VR教育应用开发
  • 纯Qt代码实现onvif协议设备端/onvif设备模拟器/onvif虚拟监控设备/桌面转onvif
  • *补*““逆元求组合数”(费马小定理
  • C# WPF中Binding的 Source属性和ElementName属性有什么区别
  • Typora to Obsidian 迁移助手 (Typora-to-Obsidian-Migration-Helper)
  • 64. 最小路径和
  • 题解:P1020 [NOIP 1999 提高组] 导弹拦截
  • 哈希表专题
  • Meta基础设施演进与AI技术革命
  • 完整教程:Spring AI整合聊天模型DeepSeek
  • 2025 年焚烧炉厂家 TOP 企业品牌推荐排行榜!权威甄选实力与口碑俱佳的江苏焚烧炉 / 无锡焚烧炉推荐这十家公司!
  • 2025 年防腐涂料厂家 TOP 企业品牌推荐排行榜,乙烯基、环氧煤沥青、环氧防腐涂料、防腐涂料地坪 、防腐涂料水池推荐这十家公司!
  • 2025双氧水厂家权威推荐榜:优质供应与专业定制实力之选
  • Win环境下包管理工具
  • MX Round 11 解题报告
  • 用 C# 打造企业资产管理系统雏形——从控制台到完整模块设计 - 详解
  • java开发之微信机器人的二次开发
  • 10.1刷题计划一
  • 笔记本电脑重装系统后找不到5G WIFI无线网或蓝牙模块消失的解决方案
  • 菜鸟坚持记录-开头篇
  • AI+传统工作流:Photoshop/Excel的智能插件开发指南 - 实践
  • Typora 笔记迁移 Obsidian 图片附件库批量移动方法,适用于笔记整理。
  • 2025年确有专长培训权威推荐榜:专业资质与特色诊疗口碑之选
  • 开源 C# 快速构建(五)自定义控件--仪表盘
  • 2025中医师承培训、考试、认证机构权威推荐榜:名师传承与临床实践口碑之选
  • 电子文件分类整理与双向同步 2025年10月1日
  • C++版搜索与图论算法 - 详解