The Preliminary Contest for ICPC Asia Nanchang 2019

目录

  • Solutions

    • B. Fire-Fighting Hero
    • E. Magic Master

Link

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

The Preliminary Contest for ICPC Asia Nanchang 2019的相关文章

C:Dawn-K&#39;s water (The Preliminary Contest for ICPC Asia Shenyang 2019)

Dawn-K recently discovered a very magical phenomenon in the supermarket of Northeastern University: The large package is not necessarily more expensive than the small package. On this day, Dawn-K came to the supermarket to buy mineral water, he found

The Preliminary Contest for ICPC Asia Shenyang 2019

The Preliminary Contest for ICPC Asia Shenyang 2019 Texas hold'em Poker #include <bits/stdc++.h> using namespace std; const int maxn=1e6+10; int num[1000]; int shun(){ for (int i=15;i>=5;i--){ if (num[i]&&num[i-1]&&num[i-2]&&a

The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力)

The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力) 传送门:https://nanti.jisuanke.com/t/41400 题意: 给你三个数组a,b,c,要你求有多少个三元组(i,j,k),使得 \[ \begin{array}{l}{\left|A_{i}-B_{j}\right| \leq C_{k}, \text { and }} \\ {\left|B_{j}-C_{k}\right| \leq

The Preliminary Contest for ICPC Asia Shenyang 2019 H. Texas hold&#39;em Poker

题目链接:https://nanti.jisuanke.com/t/41408 题目意思很简单,就是个模拟过程. 1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <map> 6 #define rep(i,j,k) for(int i = (j); i <= (k); ++i) 7 #define

The Preliminary Contest for ICPC Asia Shenyang 2019 F. Honk&#39;s pool

题目链接:https://nanti.jisuanke.com/t/41406 思路:如果k的天数足够大,那么所有水池一定会趋于两种情况: ① 所有水池都是一样的水位,即平均水位 ② 最高水位的水池和最低水位的水池高度只相差一个高度,且最低水位一定是平均水位 如果k给了个限制: 我们当然需要先算出所有水池高度的平均值. 然后从低到高排序,二分小于平均值的水位,二分高于平均值的水位, 然后判断二分的预期值需要的天数是否小于等于k.然后二分找出最低水位的最大值, 最高水位的最小值,两者相减就是答案了

The Preliminary Contest for ICPC Asia Nanjing 2019/2019南京网络赛——题解

(施工中……) 比赛传送门:https://www.jisuanke.com/contest/3004 D. Robots(期望dp) 题意 给一个DAG,保证入度为$0$的点只有$1$,出度为$0$的点只有$n$. 现在一个机器人从$1$出发,每天都会以相同的概率前往相邻节点之一或静止不动. 每天机器人消耗的耐久等于经过的天数. 求机器人到点$n$期望消耗的耐久. 划水划的很愉快,唯一一道做出来的题.但是和题解做法不同(感觉我的方法麻烦),因此砸了3h在这题上面(正在试图读懂题解ing). 设

The Preliminary Contest for ICPC Asia Nanjing 2019 D. Robots(概率dp)

题目链接:https://nanti.jisuanke.com/t/41301 题目大意: 给定一个没有循环的有向图,它从节点1开始,到节点n结束. 有一个机器人从1开始,每天都会以相同的概率前往相邻节点之一或静止不动.每天机器人的耐久性消耗量等于经过的天数. 请计算机器人到达节点n时的预期耐久性消耗量. 保证只有一个节点(节点1)的in-degree等于00,并且只有一个节点(节点n)的out-degree等于0.并且图中没有多个边缘. 解题思路: 设dp[i]为从i到达终点n的期望时间那么很

The Preliminary Contest for ICPC Asia Xuzhou 2019

A What is better? 推不出来,写个程序打表,用扩展中国剩余定理合并,居然会溢出longlong,还好不会溢出__int128(赛后exit(-1)测试),实际证明溢出返回-1是不靠谱的,毕竟后面可以又把它搞小了. #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef __int128 lll; const int MAXK = 10 + 5; void exgcd(lll a, ll

The Preliminary Contest for ICPC Asia Shanghai 2019

D. Counting Sequences I 暴力搜索. #include <bits/stdc++.h> using namespace std; typedef long long ll; const int MOD = 1000000007; map<vector<short>, short> m; vector<short> vec; void calc(int num1) { vector<short> tmp; if(num1) t