G. Bicycles
1.C. Insert and Equalize2.C. Removal of Unattractive Pairs3.D. Jumping Through Segments4.E. Good Triples5.F. Shift and Reverse6.D. Yet Another Monster Fight7.A. Constructive Problems8.C. Game with Multiset9.A. Rating Increase10.B. Swap and Delete11.A. Problemsolving Log12.B. Preparing for the Contest13.C. Quests14.D. Three Activities15.E2. Game with Marbles (Hard Version)16.cf刷题有感17.A. Anonymous Informant18.A. Forked!19.B. Make Almost Equal With Mod20.C. Heavy Intervals21.D. Split Plus K22.A. 202323.B. Two Divisors24.C. Training Before the Olympiad25.D. Mathematical Problem26.F. Greetings27.C. Partitioning the Array
28.G. Bicycles
29.E. Eat the Chip30.G. Lights31.D. Array Repetition32.D. Berserk Monsters33.E. Increasing Subsequences34.D. Very Different Array35.G. Mischievous Shooter36.B. Plus-Minus Split37.B. A Balanced Problemset38.C. Did We Get Everything Covered39.D. Find the Different Ones!40.C. Grouping Increases41.D. Good Trip42.C. Physical Education Lesson43.E. Final Countdown44.D. Divisible Pairs45.G. Vlad and Trouble at MIT46.A. Brick Wall47.B. Minimize Inversions48.C. XOR-distance49.A. Moving Chips50.B. Monsters Attack!51.C. Find B52.D. Slimes53.C. Turtle Fingers: Count the Values of k54.D. Turtle Tenacity: Continual Mods55.D. Vlad and Division56.C. LR-remainders57.D. Lonely Mountain Dungeons题记,一道思考加编写加优化耗时2h的题
1.核心:抵达终点的路途中,如果换自行车,一定是换一辆速度系数更小的车
2.从速度系数最小的城市出发,到达终点的cost等于其系数乘上到达终点的最小距离
3.从速度系数第二小的城市出发,到达终点的最小值一定是直接往终点走和先去速度系数最小的城市之后再往终点走中的最小值
4.以此类推即可,细节我放在了code里,最细节的一点是这并不是一个多源最短路,而是单源最短路,在每个点作dijk的耗时比整体作spfa快很多
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct edge
{
ll to;
ll len;
};
vector<edge> G[1005];
void add(ll x,ll y,ll w)
{
G[x].push_back({y,w});
G[y].push_back({x,w});
}//以上操作为存边
struct unit
{
ll speed;//这个城市自行车的速度系数
ll id;
ll cons;
}city[1005];
ll dis[1005];//代表某个点到剩下其余点的最小值
bool cmp(unit a,unit b){return a.speed<b.speed;}
struct fresh
{
ll to;
ll val;
bool operator <(const fresh &b) const{return b.val<val;}//由于二元且升序,所以需要重载运算符
};
void dijk(ll who)//单源最短路
{
memset(dis,0x3f3f3f,sizeof dis);
priority_queue<fresh> q;
q.push({who,0});
while(q.size())
{
ll now=q.top().to;
ll val=q.top().val;
q.pop();
if(dis[now]<=val)continue;
dis[now]=val;
for(int i=0;i<G[now].size();i++)
{
ll next=G[now][i].to;
ll v=G[now][i].len+val;
if(v<dis[next]) q.push({next,v});
}
}
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);
ll t;
cin>>t;
while(t--)
{
ll n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)G[i].clear();
for(ll i=1;i<=m;i++)
{
ll x,y,w;
cin>>x>>y>>w;
add(x,y,w);
}
for(ll i=1;i<=n;i++)
{
cin>>city[i].speed;
city[i].id=i;
}
sort(city+1,city+n,cmp);//按速度排序,速度快的在前面,也就是速度系数小的在前面
dijk(city[1].id);
city[1].cons=city[1].speed*dis[n];
ll ans=city[1].cons;//如果没有进入循环代表只有两个值,直接走就行了
for(ll i=2;i<n;i++)
{
dijk(city[i].id);//由于我只需要知道现在这个点到其他点的最小值,并不需要知道所有点之间的距离,我所需要的也只是其他点出发到达n点的最小值
city[i].cons=city[i].speed*dis[n];//代表直接走
for(ll j=1;j<i;j++) city[i].cons=min(city[i].cons,city[i].speed*dis[city[j].id]+city[j].cons);//换自行车一定是换一辆速度比自己快的自行车
if(city[i].id==1) ans=city[i].cons;
}
cout<<ans<<endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~