ABC224做题笔记
Atcoder Begineer Contest 224
D - 8 Puzzle on Graph
题目大意
给定一个
解题思路
考虑与八数码相同的做法。
将九个顶点对应的状态压缩成一个九位数,即每个定点上对应了哪个棋子。
令第
然后将这个九位数压入队列,跑 BFS 求解,再用一个 map 记录,最后判断能否达到
生成初始状态部分:
string str="999999999"; //一开始都没有摆棋子
for(int i=1,pos;i<=8;i++){
cin>>pos;
str[pos-1]=i+'0'; //读入第 i 个棋子的位置后替换相应位置
}
BFS 部分:
mp[str]=1;
q.push(str);
while(!q.empty()){
str=q.front();
q.pop();
int u=1;
for(int i=0;i<9;i++){
if(str[i]=='9'){
u+=i; //找到没有棋子的顶点的位置
break;
}
}
for(auto v:G[u]){
string n_str=str;
swap(n_str[u-1],n_str[v-1]);
if(mp[n_str]){
continue;
}
mp[n_str]=mp[str]+1;
q.push(n_str);
}
}
if(!mp["123456789"]) cout<<-1<<"\n"; //如果没有走过,就说明无法到达
else cout<<mp["123456789"]-1<<"\n";
E - Integers on Grid
解题思路
考虑设
对数组进行排序,然后进行状态转移:
答案依次输出
cin>>h>>w>>n;
for(int i=1;i<=n;i++){
cin>>r[i]>>c[i]>>a[i];
mp[INF-a[i]].push_back(i);
}
for(auto p:mp){
vector<int> now=p.second;
for(auto v:now){
f[v]=max(f[v],max(rmax[r[v]],cmax[c[v]]));
}
for(auto v:now){
rmax[r[v]]=max(rmax[r[v]],f[v]+1);
cmax[c[v]]=max(cmax[c[v]],f[v]+1);
}
}
for(int i=1;i<=n;i++){
cout<<f[i]<<"\n";
}
F - Problem where +s Separate Digits
题目大意
有一个只含
在这个串中加最少
解题思路
考虑 dp
-
设
表示 中,第 位与第 位之间没有加号的方案数 -
设
表示 中,第 位与第 位之间有加号的方案数
容易得到状态转移:
解释:第
解释:第
最终答案为
n=s.length();
pow_2[0]=1ll;
for(int i=1;i<=n;i++){
pow_2[i]=(pow_2[i-1]*2ll)%mod;
}
for(int i=1;i<=n;i++){
ll u=s[i-1]-'0';
f[i]=((f[i-1]*10)%mod+(u*pow_2[i-1])%mod)%mod;
g[i]=((g[i-1]*2)%mod+f[i-1])%mod;
}
cout<<(f[n]+g[n])%mod<<"\n";
G - Roll or Increment
题目大意
有一个
可以进行以下两次操作,次数不限。
-
操作一:花费
代价,使骰子显示的数值 "增加" 。 -
操作二:花费
代价,重新投掷骰子。
要让骰子从初始状态显示
求当使用最优策略使该期望值最小时,这样做所需花费的最小期望值。
解题思路
显然,应该操作一还是操作二,只取决于骰子当前显示的数字。
对于每一个
注意到:
-
如果骰子显示的数字大于
,那么显然操作二是最佳选择。 -
在操作一之后立即操作二显然比仅仅操作二更劣。
因此,在最优策略中,如果当骰子显示的数字为
根据上述两点,开始思考最优策略:
存在一个满足
如果骰子显示
否则,选择 操作二。
问题转化为:
求选择一个整数
开始分类讨论:
- 在"
成立 "的条件下选择 。 - 在"
不成立 "的条件下选择 。
第一种情况:在 "成立
因为我们选择 操作一,直到骰子显示的数字从
第二种情况:在"
骰子上的数字从
- 首先,重复操作二,直到骰子显示的数字在
和 之间。 - 然后,重复"增加骰子显示的数字",直到数字变成
。
每一步所需的花费如下。
-
进行一次操作二后,骰子显示
和 之间数字的概率 "为 ,因此第一步中操作二的预期次数为 。第一步的花费为 。 -
第一步结束后,模具有可能出现介于
和 之间的任何整数。因此,第二步的花费为 。
将骰子显示的数字从
那么如何在
考虑函数
可以观察图像计算可得,函数
另外,由于
因此,只需计算
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现