【解题报告】Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)

电机控制必看!SVPWM谐波优化:5段式与7段式全参数对比测试 本文通过实测数据,对比分析了电机控制中5段式与7段式SVPWM控制算法的谐波性能。实验表明,7段式SVPWM在电流波形质量(THD)和低速性能上更优,而5段式SVPWM则在开关损耗和效率方面表现突出。文章为工程师在不同应用场景(如对噪音、效率或动态响应的侧重)下的算法选型提供了清晰的依据和实用的工程指南。 阅读详情

题目链接


A. Vicious Keyboard(Codeforces 801A)

思路

本题的入手点在于,由于最多只能修改一个字符,所以可以枚举被修改的字符。
枚举被修改的字符,然后统计 VK 出现的次数,更新答案。注意还可以不是用修改的机会

代码

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

string s;
int cnt, ans;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> s;
    // 枚举被修改的字符
    for(int i = 0; i < s.size(); i++) {
        // 修改字符
        if(s[i] == 'V') {
            s[i] = 'K';
        }
        else {
            s[i] = 'V';
        }
        cnt = 0;
        for(int j = 0; j < s.size() - 1; j++) {
            if(s[j] == 'V' && s[j + 1] == 'K') {
                cnt++;
            }
        }
        ans = max(ans, cnt);
        // 还原被修改的字符
        if(s[i] == 'V') {
            s[i] = 'K';
        }
        else {
            s[i] = 'V';
        }
    }
    cnt = 0;
    // 统计不修改的情况
    for(int j = 0; j < s.size() - 1; j++) {
        if(s[j] == 'V' && s[j + 1] == 'K') {
            cnt++;
        }
    }
    ans = max(ans, cnt);
    cout << ans << endl;
    return 0;
}

B. Valued Keys(Codeforces 801B)

思路

本题的入手点在于寻找最特殊的构造方式。
设输入的字符串为 x 和 z 。我们要寻找满足 f(x,y)=z 的 y 。若 z 中某位置出现比 x 中对应位置字典序大的字符,那么就无解。否则一定有解,并且我们可以贪心地令 y=z 来构造 y 。

代码

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

string x, z;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> x >> z;
    for(int i = 0; i < x.size(); i++) {
        if(x[i] < z[i]) {
            cout << -1 << endl;
            return 0;
        }
    }
    cout << z << endl;
    return 0;
}

C. Voltage Keepsake(Codeforces 801C)

思路

本题的入手点是,寻找最值比较麻烦,但判定值是否满足条件比较容易。于是可以利用二分查找来解决问题。
首先先判断什么时候有无穷解。显然,当充电的速度大于设备的耗电速度之和的时候可以用无限地使用设备。
在剩下的有解的情况中,寻找最值是比较麻烦了,但判定某个解 t 是否满足条件还是比较容易的。假设 ok(t) 判定表示所有设备坚持使用t单位的时间是否有问题的函数,我们现在要完成这个函数的编写。显然我们可以计算出在 t 时间内所有设备的总用电量和 t 时间内设备能够充上的总电量,比较它们的大小就能完成 ok(t) 的功能了。
利用这个函数进行二分查找,不断地通过判断答案区间中点的解是否满足条件来缩小答案区间,知道最后得到问题的解。

代码

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

typedef long long ll;
const int maxn = 1e5 + 10;
const double eps = 1e-10, INF = 1e10 + 10;
int n, p, a[maxn], b[maxn];
ll sum;
double l, r, mid;

// 防止精度出错的a <= b的判断
bool LE(double a, double b) {
    return a - b < eps;
}

// 判断所有设备是否能运行时间t
bool ok(double t) {
    double timeUsed, all = 0;
    for(int i = 1; i <= n; i++) {
    // 计算单个设备需要占用的充电时间
        timeUsed = (1.0 * a[i] * t - b[i]) / (1.0 * p);
        if(timeUsed > eps) {
            all += timeUsed;
        }
    }
    return LE(all, t);
}

int main() {
    scanf("%d%d", &n, &p);
    for(int i = 1; i <= n; i++) {
        scanf("%d%d", &a[i], &b[i]);
        sum += a[i];
    }
    if(sum <= p) {
        cout << -1 << endl;
        return 0;
    }
    // 二分查找
    l = 0;
    r = INF;
    for(int i = 1; i <= 100; i++) {
        mid = (l + r) / 2;
        if(ok(mid) == true) {
            l = mid;
        }
        else {
            r = mid;
        }
    }
    printf("%.9f\n", l);
    return 0;
}

D. Volatile Kite(Codeforces 801D)

思路

本题的入手点是,所有点的可移动距离为 d ,那么所有点的移动范围为一个圆,于是可以将问题转化为静态的几何问题。

所有点可以移动到某个圆的边界和圆内的所有点所在的位置,那么请看下图:

这里写图片描述

(图片来源(http://codeforces.com/blog/entry/51598))

我们现在来探究多边形不凹的条件。对于任意三个点 A,B,C ,以它们为圆心 d 为半径分别画三个圆。点 A,B,C 最远可分别移动到圆 A,B,C 上。图中的红点就是它们移动后的点。可以直观地看出,圆 B 上的红点必须离线段 AC 足够远,若圆 B 上的红点靠近到圆 AC 上的红点之间的虚线以内,那么最后生成的多边形就可能是凹的。那么,只要点 B 到直线 AC 的距离大于或等于 2d 就能保证最后生成的多变形不凹了。
因为对于任意三个点都是如此,所以只要求出任意三点 A,B,C 之间 B 到线段 AC 的最小值 Min ,令 d=Min2 就可以得到答案 d 。现在问题转化成求任意三点 A,B,C 的 B 到线段 AC 的最小值 Min 。
枚举三个点肯定是会超时的,所以必须另辟蹊径。我们注意到,最后的答案一定在 A,B,C 三个点相邻的情况下求出的点到线段距离之中(这些一定是最短的)。于是我们按照顺时针顺序(或逆时针顺序)枚举点 A ,计算点到直线距离的同时更新答案即可。

代码

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

// 一些常数的定义
const double eps = 1e-8;
const double INF = 2e9 + 10;

inline int cmp(double x) {
    return x < -eps ? -1 : (x > eps);
}

// 平方及安全开方函数
inline double sqr(double x) {
    return x * x;
}
inline double Sqrt(double n) {
    return sqrt(max(0.0, n));
}

// 表示点的结构体
struct Point {
    double x, y;
    Point() {}
    Point(double x, double y): x(x), y(y) {}
    void input() {
        scanf("%lf%lf", &x, &y);
    }
    friend Point operator - (const Point& a, const Point& b) {
        return Point(a.x - b.x, a.y - b.y);
    }
    double norm() {
        return Sqrt(sqr(x) + sqr(y));
    }
};

// 计算叉积(外积)
double det(const Point& a, const Point& b) {
    return a.x * b.y - a.y * b.x;
}

// 计算点积(内积)
double dot(const Point &a, const Point& b) {
    return a.x * b.x + a.y * b.y;
}

// 计算点到线段的距离
double disPointToSegment(const Point p, const Point s, const Point t) {
    if(cmp(dot(p - s, t - s)) < 0) {
        return (p - s).norm();
    }
    if(cmp(dot(p - t, s - t)) < 0) {
        return (p - t).norm();
    }
    return fabs(det(s - p, t - p) / (s - t).norm());
}

const int maxn = 1010;
int n;
Point ps[maxn];

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        ps[i].input();
    }
    ps[n + 1] = ps[1];
    ps[n + 2] = ps[2];
    double Min = INF;
    // 枚举点A
    for(int i = 1; i <= n; i++) {
        Point A = ps[i];
        Point B = ps[i + 1];
        Point C = ps[i + 2];
        double d = disPointToSegment(B, A, C);
        Min = min(Min, d);
    }
    printf("%.10f\n", Min / 2);
    return 0;
}

野火STM32F407(骄阳)+无刷直流驱动板+永磁同步电机控制学习记录(四)(基于HAL库) 以上内容都是参考别人资料自学的,很多地方都是凭感觉,因为理论部分不太会算,只要电机能转就行,其他性能指标都没考虑,因为不会,所以这纯属是学习记录帖。带宽在500时,电流波动小,但是响应很慢,就是堵转后不太容易恢复转动。速度环带宽设定小了,响应不够快,带宽设定大了波动比较大,电机感觉起来也震一点,而且,当带宽设到200的时候,启动直接就锁死了,应该是PI增益设定太大了。电流环带宽的试验:去掉速度环,让Iq_Set=2,Ud=0,此时电机是电流环闭环控制,用手堵转电机然后松开,看电流的波动以及响应情况。 阅读详情

相关推荐

深入解析Docker Overlay2磁盘空间占用问题及高效清理策略

本文深入解析了Docker Overlay2存储驱动导致磁盘空间占用的核心原因,包括镜像与容器残留、日志文件膨胀、应用层泄漏及驱动特性。提供了从全局检查到精准定位的完整排查方法,并给出了从常规清理到配置优化的多维度高效清理策略,帮助用户从根本上解决Docker磁盘空间问题。

data3的博客 900

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)

题目A. Vicious Keyboardtime limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output Tonio has a keyboard with only two letters, “V” and “K”.One day, he ha

wwx233的博客 582

人工智能学习之机器人路径规划优化

A* AStar 人工智能 机器人路径规划优化

RongLin02的博客 7073

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) A -- D

A. Vicious Keyboard time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Tonio has a keyboard with only two lett

Gerry99的博客 833

硬全桥副边钳位管Vds电压凸台揭秘——寄生参数引发的导通异常

本文深入分析了硬全桥副边钳位管Vds电压凸台现象,揭示了寄生参数如何引发导通异常。通过波形分析和工程实践,详细解析了走线电感的蓄能效应和体二极管的接力作用,并提供了PCB布局优化、元件选型和驱动电路调整等解决方案,帮助工程师有效应对这一常见问题。

weixin_30825581的博客 430

Hermes Agent Windows安装教程:本地智能体离线部署实战

本地智能体(Local Agent)是一种运行在用户设备端、无需云端依赖即可响应自然语言指令并自动化执行任务的轻量级AI运行时框架。其核心原理基于配置驱动的任务监听与脚本调用机制,通过服务化驻留实现持续响应能力,技术价值在于保障数据隐私、规避API调用限制、适配内网及老旧系统环境。典型应用场景包括财务报表自动整理、科研仪器数据归档、IT资产变更通知等Windows桌面自动化需求。本文聚焦Hermes Agent这一主流开源实现,围绕Windows平台特有的服务注册、权限模型、杀软拦截、中文路径与YAML编码

weixin_34411563的博客 433

深夜切题——Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)

A. Vicious Keyboard time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Tonio has a keyboard with only two lett

GSilang's blog 5894

DPABI实战:手把手教你处理小鼠静息态fMRI数据(从Voxel Size到SPM完整流程)

本文详细介绍了使用DPABI处理小鼠静息态fMRI数据的完整流程,从Voxel Size调整到SPM分析,涵盖预处理、质量控制和可视化等关键步骤。针对小鼠数据特有的低分辨率和信噪比问题,提供了实战建议和避坑指南,帮助研究人员高效完成数据分析。

weixin_42663213的博客 478

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) D (简单计算几何)

B. Volatile Kite time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output You are given a convex polygon P with n di

K键盘里的青春K 477

Delphi开发者必备:CEF4Delphi跨平台浏览器嵌入实战指南(含Lazarus适配)

本文详细介绍了Delphi开发者如何利用CEF4Delphi实现跨平台浏览器嵌入,包括环境配置、Lazarus适配、ARM架构优化及Firemonkey集成等实战技巧。通过Chromium引擎的强大功能,开发者可以轻松为传统桌面应用添加现代浏览器特性,提升多平台开发效率。

weixin_29233333的博客 227

STM32CubeIDE入坑指南

一 前言 在科技日新月异的今天,作为从事效率为先的苦逼 IT 行业,秉承着我不入地狱谁入地狱的伟大革命精神,我决定再一次做第一个吃螃蟹的人,通过自身的入坑过程,为大家测试STM32CubeIDE这款新式工具。(其实是为了我能省点时间,快点做完项目,多挣点钱买几瓶肾气丸) 二 看一看别人是如何入坑的 二 手把手带你入坑 三 相关资料 ...

CH的博客 1万+

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) D. Volatile Kite

可单独拿一个点来看,如果要使凸包退化,即使得其与其的相邻两点变成至少三点共线,这种情况的移动最小距离是以其相邻两点为底,该点为顶点的三角形的高的一半,所以二分答案,遍历每个点求三角形的高的一半和该值作对比即可 #include using namespace std; int n,px[1005],py[1005]; double l=0,r=1e9; double distance(doubl

PrimeG的博客 464

数仓建模—数据治理框架选型

全名主要亮点覆盖面最广:从数据治理、架构、质量、安全到元数据、主数据、数据仓库等等,几乎所有数据管理主题都能在DMBOK里找到相应章节。概念权威统一:帮助组织建立通用术语和知识基础,减少“部门之间说法不一致”的沟通成本。适用场景:如果你所在公司(或团队)正准备系统梳理数据管理的方方面面,DMBOK是一份非常全面的指导手册,尤其适合培养新人或为整个组织统一认知。需要注意:DMBOK偏“知识指引”,不直接提供成熟度模型或实施路线图。想要落地,还需要结合其他评估模型或项目管理方法。小案例举例:某。

2401_84052244的博客 4745

CF-Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)-A-Vicious Keyboard

ACM模版描述题解一个模拟问题,O(n)解,先查找所有不用置换的VK组合数,然后能够通过一次置换得到VK的组合只有出现连着的两个字符相同,而这里又需要注意的是,两个V相连时,如果再往后接着K那么就不能算是可以置换的,而只能算是一个V+一个不用置换的VK,这样也就 AC 了。代码#include <iostream> #include <string>using namespace std;int m

逐梦者 431

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) 题解

A. 题意:给一个仅由‘V’ ,‘K’构成的串,允许修改一个字母,问最多出现几个VK. 思路:先把相邻的"VK"添加入答案,并立下flag,表示不能被修改,然后尝试着修改"VV","KK"。 hack: KV(这个栗子答案为0) #include <iostream> #include <cstring> using namespace std; cha...

weixin_30262255的博客 95

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) C. Voltage Keepsake

直接二分即可,右端点的初始值要设大一些,然后直接循环若干次,若大于一个足够大的数就输出-1,否则就输出左端点 #include using namespace std; int n,p,a[100005],b[100005]; double l=0,r=1e15; bool check(double x) { double ret=0; for(int i=0;i<n;i++)r

PrimeG的博客 450

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) C Voltage Keepsake

地址:http://codeforces.com/contest/801/problem/C 题目: C. Voltage Keepsake time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output...

weixin_30307921的博客 133

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) B. Valued Keys

只要y的每个字母都小于等于x的就直接把y输出,否则输出-1 #include using namespace std; string s1,s2; int main() { cin>>s1>>s2; for(int i=0;is1[i])return cout<<-1,0; cout<<s2; return 0; }

PrimeG的博客 419

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)(A.思维题,B.思维题)

A. Vicious Keyboard time limit per test:2 seconds memory limit per test:256 megabytes input:standard input output:standard output Tonio has a keyboard with only t...

weixin_34281477的博客 122

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)-C. Voltage Keepsake

C. Voltage Keepsake  做这个题做了两小时,题不错,比赛的时候经(实)不(在)住(做)睡(不)觉(出)的(来)诱惑然后做了半小时就睡了。但题还是要补的。  题意:n台机器同时工作,每台机器耗电的速率为ai,初始电量为bi。现在有一个充电机可以以每秒p的速率给任意一台机器充电,当有一台机器电量为0时,所有工作室结束,求最多能工作多久,如果可以无限工作,输出-1。  好吧,

NYIST_TC_LYQ的博客 457

Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2) A. Vicious Keyboard

改一次最多增加一个,遍历一遍即可 #include using namespace std; char s[105]; int cnt=0,flag=0; int main() { cin>>s; for(int i=0;i<strlen(s)-1;i++) { if(s[i]=='V'&&s[i+1]=='K')cnt++,i++; el

PrimeG的博客 439
上一篇: 【解题报告】Codeforces Round #410 (Div. 2)
下一篇: 【学习笔记】用算法题介绍C++的pb_ds库中的可并堆
TRiddle
博客等级 码龄11年 14粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值