梦熊2024--七月份--S组
1.梦熊2024--四月份--基础算法组
2.梦熊2024--七月份--S组
A
考虑什么情况可以走到所有的点。
如果用能走
和 的点,那么一定可以走 ,所以 的数们可以走到所有的点
那么为什么能走
先假设就是刚刚的
和 , ,那么往这边走 个 ,再往那边走 个 ,就是要证明 。
可以写成 , 可以写成 ,那么就是要证明 , , 即可。
所以我们只需要求几个
那么我们可以开一个数组
那么我们对于每一个
注意这个是
点击查看代码
#include<bits/stdc++.h>
using namespace std;
int n;
int x[1005],c[1005];
int gcd(int x,int y){
return y == 0?x:gcd(y,x%y);
}
map<int,int> dp,mp;
signed main(){
cin >> n;
int tmp = 0;
for(int i = 1;i <= n;++ i){
cin >> x[i];
tmp = gcd(x[i],tmp);
}
for(int i = 1;i <= n;++ i){
cin >> c[i];
}
if(tmp != 1){
cout << "imposib1e";
return 0;
}
vector<int> s;
s.push_back(0);
mp[0] = 1;
for(int i = 1;i <= n;++ i){
for(int j = 0;j < s.size();++ j){
int w = s[j];
int t = gcd(w,x[i]);
dp[t] = dp[t] == 0?dp[w]+c[i]:min(dp[t],dp[w]+c[i]);
if(mp[t] != 1){
mp[t] = 1;
s.push_back(t);
}
}
}
cout << dp[1];
return 0;
}
B
先明确一个条件:虽然他说只能向后走,但其实我们可以向前走并不花时间,因为如果我们想向前走,只要在那个点的时候多停一会即可,就相当于向前走了。
那么考虑一下前两个特殊条件。
也就是说走不花时间,所以我们可以将 的时间全部花在取快乐值上。那么我们可以用一个大根堆,一开始把所有的点的初始快乐值加到堆里,每次取出最大的加入答案中,并把减去 的数再加进去。为什么呢?因为我们刚刚说了,向前走不花时间,这个向后走也不花时间,那么就可以随意窜来窜去。
这样,我们就可以在同一个点上待上很久,并一直取他,因为他的快乐值不会变小。那么我们枚举待在哪个点,看看走到这个点要多久,剩下的时间就可以一直取他喽。这里延伸一下,我们从这里可以看出取快乐值要有一个范围,如
,因为加到 (走到 )后就 了走都走不到,只能走到 ,后面的值是取不到的。
那么特殊条件考虑完了,在考虑一下正解。
我们以第一个特殊条件为主出发去考虑
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具