目录
- Solutions
- B. Fire-Fighting Hero
- E. Magic Master
Solutions
B. Fire-Fighting Hero
题意:
思路:
dijkstra最短路
先以 hero 为起点 跑一遍 dijkstra
建立 起点 \(p\) 并与各 fire-fighting point 建立权为 \(0\) 的边,跑一遍 dijkstra
第二次 dijkstra 中 dis[i] 为各 fire-fighting point 到各点的最短路径中的最小值
最后将两遍 dijkstra 的 dis 中的最大值进行比较即可
代码:
[]
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
const int INF=0x3f3f3f3f;
int v,e,s,k,c;
int cnt;
int to[520000];
int val[520000];
int nxt[520000];
int head[1005];
int dis[1005];
int vis[1005];
int xfy[1005];
int o;
priority_queue<pii,vector<pii>,greater<pii> >q;
void init1()
{
cnt=0;
for(int i=1;i<=k+k+e+e;i++) to[i]=val[i]=0;
for(int i=0;i<=v;i++) head[i]=0;
}
void init2()
{
for(int i=0;i<=v;i++) vis[i]=0,dis[i]=INF;
dis[o]=0;
while(!q.empty()) q.pop();
}
void addEdge(int a,int b,int d)
{
cnt++;
to[cnt]=b;
val[cnt]=d;
nxt[cnt]=head[a];
head[a]=cnt;
}
void dijkstra()
{
q.push(pii(0,o));
while(!q.empty())
{
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int e=head[u];e;e=nxt[e])
if(dis[u]<INF&&dis[to[e]]>dis[u]+val[e])
{
dis[to[e]]=dis[u]+val[e];
q.push(pii(dis[to[e]],to[e]));
}
}
}
int main()
{
int T;
scanf("%d",&T);
int a,b,d;
int resXfy;
int resHero;
while(T--)
{
scanf("%d%d%d%d%d",&v,&e,&s,&k,&c);
init1();
resXfy=-1;
resHero=-1;
for(int i=0;i<k;i++) scanf("%d",&xfy[i]);
while(e--)
{
scanf("%d%d%d",&a,&b,&d);
addEdge(a,b,d);
addEdge(b,a,d);
}
o=s;
init2();
dijkstra();
for(int i=1;i<=v;i++) resHero=max(resHero,dis[i]);
for(int i=0;i<k;i++) addEdge(0,xfy[i],0),addEdge(xfy[i],0,0);
o=0;
init2();
dijkstra();
for(int i=1;i<=v;i++) resXfy=max(resXfy,dis[i]);
if(resHero<=resXfy*c) printf("%d\n",resHero);
else printf("%d\n",resXfy);
}
return 0;
}
E. Magic Master
题意:
思路:
约瑟夫环
由题意得第 \(k\) 张牌即求 \(k\) 为第几个报数为 \(m+1\) 的单位
用队列模拟即可
代码:
[]
#include<bits/stdc++.h>
using namespace std;
int a[40000001];
int main()
{
int T;
scanf("%d",&T);
int n,m,c;
while(T--)
{
int t=0;
scanf("%d%d%d",&n,&m,&c);
a[++t]=1;
queue<int>q;
for(int i=2;i<=n;i++) q.push(i);
while(!q.empty())
{
int b=m;
while(b)
{
q.push(q.front());
q.pop();
b--;
}
a[q.front()]=++t;
q.pop();
}
int d;
while(c--)
{
scanf("%d",&d);
printf("%d\n",a[d]);
}
}
return 0;
}
原文地址:https://www.cnblogs.com/c4Lnn/p/12321004.html
时间: 2024-11-08 20:16:41