atcoder abc375

A seats

代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<char> a(n + 1);
    for(int i = 1; i <= n; i ++ ) cin >> a[i];
    int cnt = 0;
    for(int i = 1; i <= n - 2; i ++ ) {
        if(a[i] == '#' && a[i + 1] == '.' && a[i + 2] == '#') cnt ++;
    }
    cout << cnt;
    return 0;
}

B Traveling Takahashi Problem

思路:模拟,写个两点之间距离公式就可以过..

代码:

#include <bits/stdc++.h>
using namespace std;

double find(double x) {
    double l = 0, r = 1e9;
    while(l < r - 1e-8) {
        double mid = (l + r) / 2;
        if(mid * mid <= x) l = mid;
        else r = mid; 
    }
    return l;
}

double calc(double x1, double y1, double x2, double y2) {
    return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}

int main() {
    int n;
    cin >> n;
    vector<double> x(n + 1), y(n + 1);
    for(int i = 1; i <= n; i ++ ) {
        cin >> x[i] >> y[i];
    }

    double ans = 0;
    //x[0] = x[n], y[0] = y[n];
    for(int i = 1; i <= n; i ++ ) {
        ans += calc(x[i], y[i], x[i - 1], y[i - 1]);
    }
    ans += calc(x[n], y[n], 0, 0);
    printf("%lf", ans);
    return 0;
}

C Spiral Rotation

问题:

思路:图是一个正方形,不难发现,每次操作的含义是将整个图形顺时针旋转90°,并且每操作一次,操作的范围就小一圈。因此我们可以从最外面一圈开始枚举,最外面一圈只会被旋转一次,其次一圈会被旋转2次...以此类推,我们可以轻松写出对于任意点(x, y)在旋转一圈内的坐标变化,接下来要做的就是根据旋转次数n % 4后的值确定每个点的最终位置即可

代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<vector<char>> a((n + 1), vector<char>(n + 1)), b((n + 1), vector<char>(n + 1));
    for(int i = 1; i <= n; i ++ ) {
        for(int j = 1; j <= n; j ++ ) {
            cin >> a[i][j];
        }
    }
    
    auto change = [&](int type, int x, int y) {
        /*if(type == 0) b[x][y] = a[x][y];
        if(type == 1) b[x][y] = a[y][n + 1 - x];
        if(type == 2) b[x][y] = a[n + 1 - x][n + 1 - y];
        if(type == 3) b[x][y] = a[n + 1 - x][y];*/
        if(type == 0) b[x][y] = a[x][y];
        if(type == 1) b[x][y] = a[n + 1 - y][x];
        if(type == 2) b[x][y] = a[n + 1 - x][n + 1 - y];
        if(type == 3) b[x][y] = a[y][n + 1 - x];
    };
    //b = a;
    for(int cnt = 1; cnt <= (n + 1) / 2; cnt ++ ) {
        //if(cnt == 1)
        for(int i = cnt; i <= n - cnt + 1; i ++ ) {
            change(cnt % 4, cnt, i);
            change(cnt % 4, n - cnt + 1, i);
            change(cnt % 4, i, cnt);
            change(cnt % 4, i, n - cnt + 1);
        }
    }
    
    for(int i = 1; i <= n; i ++ ) {
        for(int j = 1; j <= n; j ++ ) {
            cout << b[i][j];
        }
        cout << "\n";
    }
    return 0;
}

思路:由于目标串长度只有3,因此此题就是个计数题, 用map来做。对于a[i], 这个点对答案的贡献就是1 ~ i - 2内所有与之相等的字符与其的坐标差之和

代码:
 

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

int main() {
    int n;
    string s;
    cin >> s;
    n = s.length();
    vector<char> a(n + 1);
    for(int i = 1; i <= n; i ++ ) {
        a[i] = s[i - 1];
    }
    
    map<char, ll> cnt;
    map<char, ll> ma;
    ll ans = 0;
    for(ll i = 1; i <= n; i ++ ) {
        if(cnt[a[i]] != 0) {
            if(a[i] != a[i - 1]) ans += (cnt[a[i]]) * (i - 1) - ma[a[i]];
            else if(a[i] == a[i - 1]) {
                ans += (cnt[a[i]] - 1) * (i - 1) - (ma[a[i]] - (i - 1));
            }
        }
        cnt[a[i]] ++;
        ma[a[i]] += i;
    }

    cout << ans;
    return 0;
}

E 3 team division

思路:简单dp。首先可以很容易想到一个dp:

dp[i][j][k][u]表示从前i个人中选择并且队伍1的力量为j,队伍2的力量为k,队伍3的力量为u的代价的最小值。由于i是小于100的,且\sum{b_i} <= 1500因此jku的范围不超过500。这个dp数组肯定是爆内存的,可以通过滚动数组优化掉第一维,也可以优化掉最后一维,因为当我们知道了两个组的sum,第三个组的sum也就显而易见了, 现在考虑状态转移,在转移时,如果要把第i个人加入队伍x,只要判断这个人本身是否处于这个队伍中即可,如果处于这个队伍中,那么代价是0,反之代价则是1.可以用 !(a[i] == x)表示代价

代码:
 

#include <bits/stdc++.h>
using namespace std;

int dp[110][510][510];

int main() {
    int n;
    cin >> n;
    int sum = 0;
    vector<int> a(n + 1), b(n + 1), s(n + 1);
    for(int i = 1; i <= n; i ++ ) {
        cin >> a[i] >> b[i];
        sum += b[i];
        s[i] = s[i - 1] + a[i];
    }

    if(sum % 3) {
        cout << -1;
        return 0;
    }

    memset(dp, 0x3f, sizeof dp);
    dp[0][0][0] = 0;
    for(int i = 1; i <= n; i ++ ) {
        for(int j = 0; j <= 500; j ++ ) {
            for(int k = 0; k <= 500; k ++ ) {
                if(j - b[i] >= 0) dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j - b[i]][k] + !(a[i] == 1));
                if(k - b[i] >= 0) dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k - b[i]] + !(a[i] == 2));
                if(s[i] - j - k <= 500) dp[i][j][k] = min(dp[i][j][k], dp[i - 1][j][k] + !(a[i] == 3));
            }
        }
    }

    if(dp[n][sum / 3][sum / 3] == 0x3f3f3f3f) cout << -1;
    else cout << dp[n][sum / 3][sum / 3];
    return 0;
}

F

首先多个询问,且n很小,确定求最短路算法floyd

并且删边不是很好操作,那么就倒着来,把删边改成加边。加边可以在o(n2)的时间复杂度内完成对floyd的更新

代码:
 

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const ll inf = 1e18;

int main() {
    ll n, m, q;
    cin >> n >> m >> q;
    vector<pair<ll, ll>> way(m + 1);
    vector<ll> len(m + 1);
    for(ll i = 1; i <= m; i ++ ) {
        ll a, b, c;
        cin >> a >> b >> c;
        way[i] = {a, b};
        len[i] = c;
    }

    map<ll, ll> ma;
    vector<vector<ll>> stk(q + 1);
    for(ll i = 1; i <= q; i ++ ) {
        ll op;
        cin >> op;
        if(op == 1) {
            ll id;
            cin >> id;
            stk[i].push_back(op);
            stk[i].push_back(id);
            ma[id] ++;
        } else {
            ll x, y;
            cin >> x >> y;
            stk[i].push_back(op);
            stk[i].push_back(x);
            stk[i].push_back(y);
        }
    }

    vector<vector<ll>> f((n + 1), vector<ll>(n + 1, inf));
    for(ll i = 1; i <= n; i ++ ) f[i][i] = 0;
    for(ll i = 1; i <= m; i ++ ) {
        if(!ma[i]) {
            //cout << i << " " << "";
            ll a = way[i].first, b = way[i].second;
            f[a][b] = len[i];
            f[b][a] = len[i];
        }
    }

    for(ll k = 1; k <= n; k ++ ) {
        for(ll i = 1; i <= n; i ++ ) {
            for(ll j = 1; j <= n; j ++ ) {
                f[i][j] = min(f[i][j], f[i][k] + f[j][k]);
            }
        }
    }
    //cout << f[1][3] << " " << "\n";
    stack<ll> ans;
    for(ll i = q; i >= 1; i -- ) {
        auto t = stk[i];
        if(t[0] == 1) {
            ll a = way[t[1]].first;
            ll b = way[t[1]].second;
            //if(i == q - 1) cout << a << " " << b << endl;
            f[a][b] = min(f[a][b], len[t[1]]);
            f[b][a] = min(f[b][a], len[t[1]]);
           // cout << f[2][3] << " ";
            for(ll i = 1; i <= n; i ++ ) {
                for(ll j = 1; j <= n; j ++ ) {
                    f[i][j] = min(f[i][j], f[i][a] + f[b][j] + f[a][b]);
                    f[i][j] = min(f[i][j], f[i][b] + f[a][j] + f[a][b]);
                    f[j][i] = f[i][j];
                }
            }
        } else {
            //if(i == q) cout << f[t[1]][t[2]] << " ";
            if(f[t[1]][t[2]] == inf) ans.push(-1);
            else ans.push(f[t[1]][t[2]]);
        }
    }

    while(ans.size()) {
        cout << ans.top() << "\n";
        ans.pop();
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/892067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode刷题日记之回溯算法(五)

目录 前言重新安排行程N皇后解数独总结 前言 今天是学习回溯算法的第五天&#xff0c;我们继续来一起学习回溯算法蕴含的逻辑处理&#xff0c;希望博主记录的内容能够对大家有所帮助 &#xff0c;一起加油吧朋友们&#xff01;&#x1f4aa;&#x1f4aa;&#x1f4aa; 重新安…

IDEA中git如何快捷的使用Cherry-Pick功能

前言 我们在使用IDEA开发时&#xff0c;一般是使用GIT来管理我们的代码&#xff0c;有时候&#xff0c;我们需要在我们开发的主分支上合并其他分支的部分提交代码。注意&#xff0c;是部分&#xff0c;不是那个分支的全部提交&#xff0c;这时候&#xff0c;我们就需要使用Che…

重学SpringBoot3-集成Spring Boot Actuator

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成Spring Boot Actuator 1. 什么是 Spring Boot Actuator&#xff1f;2. Spring Boot Actuator 的核心功能3. Spring Boot 3 中集成 Actuator3.1 添加…

RBTree(红黑树)的介绍和实现

欢迎来到杀马特的主页&#xff1a;羑悻的小杀马特.-CSDN博客 目录 ​编辑 一红黑树介绍&#xff1a; 1.1红黑树概念&#xff1a; 1.2红黑树遵循的原则&#xff1a; 1.3红黑树效率分析&#xff1a; 二.红黑树的实现&#xff1a; 2.1红黑树结构&#xff1a; 2.2红黑树节点…

PAT甲级-1127 ZigZagging on a Tree

题目 题目大意 给出一棵树的中序和后序遍历&#xff0c;要求按层序输出这棵树&#xff0c;但是按照从左到右&#xff0c;再从右到左&#xff0c;再从左到右的顺序。 思路 由中序遍历和后序遍历可以构造出一棵二叉树。观察题目中要求的输出顺序&#xff0c;发现层数为奇数的都…

第十五章 RabbitMQ延迟消息之延迟插件

目录 一、引言 二、延迟插件安装 2.1. 下载插件 2.2. 安装插件 2.3. 确认插件是否生效 三、核心代码 四、运行效果 五、总结 一、引言 上一章我们讲到通过死信队列组合消息过期时间来实现延迟消息&#xff0c;但相对而言这并不是比较好的方式。它的代码实现相对来说比…

等保制度要求企业保障数据存储安全,天锐绿盾强大加密技术实现文档防泄密

网络安全等级保护&#xff08;等保&#xff09;制度是我国信息安全保障工作的基本制度和基本国策&#xff0c;是开展信息安全工作的基本方法&#xff0c;是促进信息化、维护国家信息安全的基本保障。等保不仅是对网络&#xff08;含信息系统、数据&#xff09;实施分等级保护、…

TypeScript数据类型限定(基本数据类型,void,数组,元组,枚举,any,unknown,never,函数,自定义数据类型,联合类型和交叉类型)

一、安装解析ts的工具包 node.js只认识js代码&#xff0c;不认识ts代码。 需要将ts代码转化为js&#xff0c;然后就可以在node.js中运行了。 安装步骤&#xff1a;打开终端&#xff0c;输入命令npm i -g typescript回车 typescript是用来解析ts的工具包。提供了tsc命令&…

基于SpringBoot+Vue+Uniapp微信小程序快递管理系统(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

量化策略交易之PTrade量化软件如何获取逐笔委托行情!get_individual_entrust

get_individual_entrust– 获取逐笔委托行情 get_individual_entrust(stocksNone, data_count50, start_pos0, search_direction1, is_dictFalse) 使用场景 该函数在交易模块可用 接口说明 该接口用于获取当日逐笔委托行情数据。 注意事项&#xff1a; 1、沪深市场都有逐…

C++,STL 033(24.10.15)

内容 queue容器&#xff08;队列&#xff09;的常用接口。 代码 #include <iostream> #include <string> #include <queue> // 注意包含queue容器&#xff08;队列&#xff09;的头文件using namespace std;class Person { public:string m_Name;int m_Age…

Android targetSdkVersion 升级为34 问题处理

原因是发布到GooglePlay遭到拒绝&#xff0c;需要最低API level为34。之前为31&#xff0c;感觉还挺高的&#xff0c;但是GooglePlay需要的更高。 记录下处理问题&#xff1a; 1.升级gradle版本为8.0.2 之前是&#xff1a; classpath com.android.tools.build:gradle:7.1.0-…

【C语言】数据类型

C语言常用数据类型 int 整型 4字节float 浮点型 4字节double 双精度浮点类型 8字节char 字符型 1字节构造类型&#xff1a;数组&#xff08;多个相同类型的变量组合&#xff09;构造类型&#xff1a;结构体&#xff08;多个不同类型的变量组合&#xff09; #include <stdi…

react18+react-transition-group实现路由切换过度

效果如下 官网安装对应的插件 创建对应的样式 .fade-enter {opacity: 0; } .fade-exit {opacity: 1; } .fade-enter-active {opacity: 1; } .fade-exit-active {opacity: 0; } .fade-enter-active, .fade-exit-active {transition: opacity 500ms; }const location useLoca…

Mysql—高可用集群MHA

1:什么是MHA&#xff1f; MHA&#xff08;Master High Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切…

【py】使用numpy读取文件,并统计

我们需要编写一个脚本来读取文本文件&#xff0c;然后进行字数统计和词频统计。 以下是一个简单的Python脚本&#xff0c;它使用numpy来处理数据。 首先&#xff0c;确保你已经安装了numpy库。如果没有安装&#xff0c;可以通过运行pip install numpy来安装。 然后&#xff0c…

Gin框架操作指南06:POST绑定(下)

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;没用过Gin的读者强烈建议先阅读第一节&#xff1a;Gin操作指南&#xff1a;开山篇。 本节继续演示POST绑定&#xff0c;包括将request-body绑定到不同的结构体中&#x…

小猿口算辅助工具(nodejs版)

github 地址&#xff1a;https://github.com/pbstar/xyks-helper 实现原理 通过屏幕截图截取到题目区域的两个数字&#xff0c;然后通过 ocr 识别出数字&#xff0c;最后通过计算得出答案&#xff0c;并通过模拟鼠标绘制答案。 依赖插件 node-screenshots&#xff1a;屏幕截…

微知-Mellanox驱动中的iSCSI是什么?有哪三种网络存储有哪三种?iSER是什么?(iSCSI协议(总线),SAN 存储区域网络)

背景 本文根据Mellanox网卡驱动中关于iSCSI模块&#xff0c;来介绍iSCSI是什么&#xff1f;该技术发展演进背景&#xff1f; 关于iSCSI iSCSI是一种协议&#xff0c;SCSI是总线。比如常说的SAS&#xff08;Serial Attach SCSI&#xff09;存储盘对比与家用的SATA&#xff0…

Facebook上的隐私保护:如何加强个人数据的安全性?

在数字化时代&#xff0c;个人数据的保护已成为用户日益关注的话题&#xff0c;尤其是在社交媒体平台如Facebook上。用户在享受社交媒体带来的便利时&#xff0c;如何有效保护个人隐私&#xff0c;维护自身的数据安全&#xff0c;成为了一个亟需解决的问题。 Facebook的隐私保护…