牛客ioi周赛22普及组题解

A.战争尾声

题意:
给定个点,第个点坐标为,现在让你在大陆上求出一个整数坐标的点,使得这个点到给定的个点的距离都相等,如果找不到则输出,相等指的是到给定个点的个距离中,任意两个差值的绝对值都小于
数据范围:
大陆是指对于任何一个点,都有的一片区域。

题解:
暴力枚举大陆上的所有点,看这个点是否满足到给定个点的距离都相等即可。

代码:

#include
using namespace std;
const double eps = 1e-4;
const int N = 210;
const int M = N * N;
struct Node {
    int x, y;
}node[N];
int vis[M];
int n;

double get(Node A, int x, int y) {
    int xx = A.x - x;
    int yy = A.y - y;
    return sqrt(xx * xx + yy * yy);
}

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        int a, b;
        scanf("%d%d", &a, &b);
        --a, --b;
        node[i] = {a, b};
        vis[a * 200 + b] = 1;
    }

    int f = -1;
    for(int i = 0; i < 200; ++i)
        for(int j = 0; j < 200; ++j) {
            int ok = 1;
            double dis = get(node[1], i, j);
            for(int k = 2; k <= n; ++k)
                if(fabs(get(node[k], i, j) - dis) < eps);
                else ok = 0;
            if(ok) return 0 * printf("%d %d\n", i + 1, j + 1);
        }

    return 0 * printf("War is cruel.");
}

B.签订协议

题意: 给定个国家的战力,每个国家的战力各不相同,第个国家战力为,每一轮开始都选择当前还没有签订协议的战力最高的国家先签订协议,如果一个国家签订过或者一个国家并非当前还没有签订协议的国家中战力最高的国家,则跳过。由于个国家代表环坐一圈,当第个国家传递给第个国家时,代表完成了一轮传递,现在问最少传递多少轮才能让所有国家才完成协议。

数据范围:

题解:
由于战力各不相同,离散化使得战力相邻的国家更容易判断。
从战力最低的国家开始反着枚举,当战力为第小的国家所在的位置再战力为第这个国家之前时,需要额外多进行一轮,因此离散化后再判断即可。

代码:

#include
using namespace std;

const int N = 8e5 + 10;
int b[N], a[N], n, g, pa[N];

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]), b[i] = a[i];
    sort(b + 1, b + n + 1);
    for(int i = 1; i <= n; ++i) a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b;
    for(int i = 1; i <= n; ++i) pa[a[i]] = i;

    int res = 0, pre = 0;
    for(int i = 1; i <= n; ++i) {
        if(pa[i] > pre) ++res;
        pre = pa[i];
    }

    printf("%d\n", res);

    return 0;
}

C.照看小猫

题意: 给定只小猫,第只小猫允许自己的名字最多有个小写字母,问给所有小猫取名的方案数,答案对取模。
数据范围:

题解:
考虑允许自己名字有个小写字母的猫的数量为为可取的名字数,
则该类小猫有种取名方案数。由于越小,可取名的范围就越小,因此从小到大考虑,每次可取名字数需要减去之前已经取过考虑的小猫数。

代码:

#include
using namespace std;

typedef long long ll;
const int N = 10010;
const ll mod = 77797;
int a[N], n;
int cnt[11];
ll act[11];
ll res = 1;

void init() {
    act[0] = 1;
    for(int i = 1; i <= 10; ++i) act[i] = act[i - 1] * 26;
    act[0] = 0;
    for(int i = 1; i <= 10; ++i) act[i] += act[i - 1];
}

int main()
{

    scanf("%d", &n);
    for(int i = 1, x; i <= n; ++i)
        scanf("%d", &x), ++cnt[x];
    init();
    for(int i = 1; i <= 10; ++i) {
        if(cnt[i] != 0) {
            if(cnt[i] + cnt[i - 1] > act[i]) return 0 * printf("-1\n");
            ll a = act[i] - cnt[i - 1], b = cnt[i];
            for(ll j = a - b + 1; j <= a; ++j) res = res * (j % mod) % mod; 
        } 
        cnt[i] += cnt[i - 1];
    }

    printf("%lld\n", res);
    return 0;
}

D.路线规划

题意: 给定个点,条边,保证图连通,问从点走到每个点之后再返回点的时间,其中经过一次第条边需要的时间,求出经过所有点并且经过最少路径的条件下,返回点的最短时间。
数据范围:
保证最后的答案小于

题解:
首先考虑经过路径最少,如果从到一个点的路径唯一,则无需考虑。如果从到一个点的路径不唯一,则必然有环,如果有环则无论从哪个点进入,经过这个环上的所有点所采取的路径一定是最短的,因此原路返回需要的时间也一定比走完这个环回到初始点需要的时间更短。因此问题变成了求解从到达剩余个点的最短单程路径,显然是需要转换为求解一个最小生成树。

代码:

#include
using namespace std;

typedef long long ll;
const int N = 2e5 + 10;
const int M = 4e6 + 10;
int p[N];
int n, m;
ll res;

struct Node {
    int a, b;
    ll c;
    bool operator < (const Node &A) const {
        return c < A.c;
    }
}e[M];

int find(int x) {
    if(x != p[x]) p[x] = find(p[x]);
    return p[x];
}

int main()
{

    scanf("%d%d", &n, &m);
    for(int i = 1; i <= m; ++i)
        scanf("%d%d%lld", &e[i].a, &e[i].b, &e[i].c);

    for(int i = 1; i     
    sort(e + 1, e + m + 1);
    for(int i = 1; i <= m; ++i) {
        int a = find(e[i].a), b = find(e[i].b);
        if(a != b) res += e[i].c, p[a] = b;
    }

    printf("%lld\n", res * 2);

    return 0;
}
全部评论

相关推荐

头像
04-27 15:11
已编辑
华东师范大学 算法工程师
暑期实习从2月开始投,面了两个月,流程该挂的都挂完了,腾讯字节一共号称是1.7w个hc,不知道都发给谁了,估计今年秋招要难顶。Timeline米哈游、美团、蚂蚁、微软等公司直接简历挂穿,没进面。携程:3.3&nbsp;投递、测评3.12&nbsp;笔试3.18&nbsp;一面3.25&nbsp;二面4.13&nbsp;ai面(hr面)4.14&nbsp;英语测评4.23&nbsp;offer(已拒)腾讯:2.6&nbsp;测评2.28&nbsp;wxg一面3.5&nbsp;wxg二面(挂)3.11&nbsp;teg一面3.21&nbsp;teg二面(取消)3.31&nbsp;teg一面4.10&nbsp;teg二面(挂)4.21&nbsp;wxg一面4.24&nbsp;wxg二面(挂)字节:1.28&nbsp;aml约面(取消)3.17&nbsp;火山一面(挂)4.8&nbsp;aml一面(挂)4.20&nbsp;抖音data一面(挂)阿里:3.23&nbsp;投递、测评3.28&nbsp;笔试3.31&nbsp;淘天一面4.8&nbsp;钉钉一面4.9&nbsp;淘天二面4.10&nbsp;阿里控股一面4.12&nbsp;钉钉二面(取消)4.15&nbsp;淘天hr面4.16&nbsp;淘天offer(已接)4.21&nbsp;高德一面(取消)4.22&nbsp;淘宝闪购一面(取消)面试最大的感触是,现在撞上ai转型,一堆老业务急着转向,新业务非常不成熟,研究型的组bar非常高根本进不去,业务侧挂着算法的岗位干的都是工程活,面试却又要问算法,另外agent的落地也远没有那么广,绝大多数还是那套写死的系统调一下llm&nbsp;api或者做做rag,其余少部分真的在搭agent的,基本不能在线上服务用什么很智能的模型,现阶段成本太高,进去大概率就是给垃圾模型从工程方面兜底,除了业务场景的应用和数据经验以外,技术方面很难有什么提升。算法岗做不了基模的还是去搜广推好,之前判断失误了完全没投,秋招不知道还进不进得去。
嵌入式的小白:不错啊,淘天也是挺好的,恭喜
我的求职进度条
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务