Codeforces Round #508 (Div. 2)

基于HPM5E00的EtherCAT从站开发实战:从硬件解析到软件调试 实时工业以太网通信是工业自动化与运动控制领域的核心技术,它通过硬件与协议栈的协同,实现了微秒级的高确定性数据交换。其技术价值在于为多轴同步、机器人控制等复杂场景提供了高实时性、高同步精度的通信基础。在应用场景上,广泛服务于数控机床、包装机械、半导体设备等高端制造领域。本文聚焦于EtherCAT从站开发,深入解析了基于先楫HPM5E00高性能MCU与专用从站控制器(ESC)的硬件架构设计,并详细阐述了开源协议栈SOES的移植、对象字典配置以及过程数据(PDO)映射等核心软件实践,为开发者快速构建稳定可靠的实时 阅读详情

A. Equality

给定一个字符串,求最长子字符串,要求所有字符出现次数相同。注意,由于要求使用的字符数k已经给出,但是不一定全部出现在字符串里,所以可能只能构造空字符串。

很简单了,先将所有字符的出现次数统计出来。然后看k个字符出现次数最少的那个,然后将最小出现次数乘以k就行了。

[n,k] = map(int, input().split())
const = input()
counting = {}
for i in range(k):
    counting[chr(ord('A') + i)] = 0
for i in const:
    counting[i] += 1
    
ret = n
for i,v in counting.items():
    ret = min(ret, v)
print(ret*k)


 B. Non-Coprime Partition

给出n,将从1到n这n个数字分到两份,分别求和得到sum1和sum2,求gcd(sum1,sum2) > 1的的分割方法。打印是否可以分割,然后把分割打印出来。

这里有一点小技巧。很明显,对于n为1,2,都是没有结果的,但是对于大于等于3的n,都是有结果的。但是具体要怎么分呢?我们直到n个数字的和为 (1 + n ) * n /2。这里,和分两种。奇数,偶数。

1,对于和为偶数的情况,任何偶数减2都还是偶数。所以最简单的分配方法,就是2一波,剩下的一波。他们的gcd为2。

2,对于和为奇数的情况,需要考虑两种情况,

a,n为奇数,这个时候,中间数middle = (1 + n)/2,必定有middle * n = (n + 1) * n /2 。很明显了,这个时候,middle一波,剩下的数一波。gcd为middle=(n+1)/2

b,n为偶数,这个时候,(1+n)/2 = middle,但是这个middle不是整数。所以我们换一个middle,用n/2。同理,middle一波,剩下的数一波,gcd为middle=n/2

n = int(input())
if n <= 2:
    print("No")
else:
    print("Yes")
    sum = (n + 1) * n / 2
    if(sum % 2 == 0):
        print("1 2")
        anotherLine = "%d 1" % (n - 1)
        for i in range(3,n + 1):
            anotherLine += " %d" % i
        print(anotherLine)
    else:
        if n % 2 == 0:
            middle = n /2
        else:
            middle = (n + 1) / 2
        print("1 %d" % (middle))
        anotherLine = "%d 1" % (n - 1)
        for i in range(2,n + 1):
            if i != middle:
                anotherLine += " %d" % i
        print(anotherLine)
    

C. Gambling

A,B两人分别有一组数字,没人可以从自己的数组取一个数字,拿起来。或者从对手的数组取一个数字,移出,不放入任何人的口袋。两人数组清空之后,游戏结束。游戏结束后,两人手中分别求手上的数字之和。求两人在用最优策略时,两人的数字相差为多少。

这个策略用贪心即可。把两人手头的数字从大到小排序,每一轮,如果自己手头的最大的数字比对手大,就拿起来,否则,移除对手的数字。

嗯。。。就是我这代码晚上写的,不够简洁。。。。

n = int(input())
A = list(map(int, input().split()))
B = list(map(int, input().split()))

A = sorted(A,reverse = True)
B = sorted(B,reverse = True)

sA, sB = 0, 0
i,j = 0,0
turn = 1
while True:
    turn += 1
    turn %= 2
    if i >= n and j >= n:
        break;
    if i == n:
        if turn == 1:
        #turn for b and a is list empty
            sB += B[j]
        j+=1
        continue
    if j == n:
        if turn == 0:
        #turn for a and b is list empty
            sA += A[i]
        i+=1
        continue
    if turn == 0:
        #turn for a
        if A[i] > B[j]:
            sA += A[i]
            i +=1
        elif A[i] < B[j]:
            j +=1
        else:
            j +=1
    else:
        if A[i] > B[j]:
            i += 1
        elif A[i] < B[j]:
            sB += B[j]
            j += 1
        else:
            i += 1
print(sA-sB)

D. Slime

有一排史莱姆,他们可以吃自己左边或者右边的史莱姆。每个史莱姆有一个数值。每次吞噬,都用自己的数字减对方的数字。求所有史莱姆吞噬完,只剩一个史莱姆的时候,能得到的最大数字是多少。

这个策略也简单。

如果输入有正有负,则将所有数字的绝对值加起来,即可(很简单,从负数开始,一直用小的吃大的,不断积累,最后用正数吃负数即可)

如果输入全部为正或者全部为负,则将所有数字的绝对值加起来,然后减 2 乘以最小的绝对值即可。第一步用最小的绝对值吃旁边的史莱姆(或者被吃掉),得到一个有正有负的数列。然后重复上面有正有负的步骤。

import sys
n = int(input())
line = list(map(int, input().split()))

if n == 1:
    print(line[0])
    sys.exit(0)

sum = 0
minNum = 10 ** 9
maxNum = -10**9
for i in line:
    if minNum > i:
        minNum = i
    if maxNum < i:
        maxNum = i
    sum += abs(i)
if minNum * maxNum < 0:
    print(sum)
elif minNum < 0:
    print(sum - 2 * abs(maxNum))
else:
    print(sum - 2 * abs(minNum))

E. Maximum Matching

有很多block,block左右分别有一种颜色,左右的,从所有block里面选一部分出来,同颜色的边可以拼在一起。求拼在一起的block的value的和最大为多少。

我一开始以为是动态规划,折腾了很久。后来看了别人的答案才知道,嗯。。。欧拉图。。。

我们把四个颜色看成四个点,一个block表示从一个点到另一个点的一条边。block的value就是边的权重。求一个子图,该子图构成欧拉回路,并且权重之和最大。

进一步,由于只有四个点,又是无向图,所以我们可以有这样的结论,要么刚好所有节点都是偶数度节点,要么有两个节点是奇数度节点,要么四个节点都是奇数度节点。这里其实只有最后一种情况不符合欧拉图的要求,这个时候需要去掉一条边,这样肯定有两个节点分别减少一个度,变成两个偶数度节点。于是问题变成了去掉那条边。

出题者给的答案是,我们只有16条边,整一个bitmap,遍历所有的边的组合。然后看哪个组合得到的和最大。时间复杂度为n * 2^16。嗯。。。。。其实挺好的。但是我觉得太复杂了。看了下答案,有复杂度为n的解。于是我研究了一下。奥,他们直接从一个节点开始dfs,遇到的节点加入进来,计算度数。如果有四个奇数度的节点在这个子图,那么需要去掉一条边,很多人直接拿一条权重最低的边一减就完事了,并且AC了。

感觉哪里不对劲的我把AC代码抄下来丢上去。跑test,一切都很愉悦,直到第117个test case,嗯???WA了?为嘛他能过,我一样的就WA,一看记录,比赛的时候只有116个test case。。。

仔细分析test case117,发现他的权重最小的那条边,是一个割边,去除之后,有一个节点从原来的欧拉图上面割裂开了。。。。看来codeforeces的测试用例也不是很全嘛。。。。

正确的做法是。将任意两个点(包括从自己出发到自己)的边的min值保存下来。先做一次dfs,这个dfs需要做的就是遍历四个点,将连通子图的权重和求出来,如果这个子图的奇数节点为4,那就丢掉这个结果。然后,遍历16条边,如果这个边在图里面出现了,不管是有一条还是几条,尝试将它抹去,然后做一次dfs,更新结果,再把这个边加回来。时间复杂度 4*4*n。很愉悦。

#include <bits/stdc++.h>

using namespace std;

int deg[4];
vector<int> e[4][4];
bool was[4];
unsigned int min_v[4][4];

int sum, min_val, cnt_node, cnt_deg, res;

vector<int> removed;
void dfs(int u) {
	was[u] = true;
	cnt_deg += deg[u];
	cnt_node += 1;
	for (int c : e[u][u]) {
		sum += c;
	}
	for (int v = 0; v < 4; ++v) {
		if (!e[u][v].empty()) {
			if (u < v) {
				for (int c : e[u][v]) {
					sum += c;
				}
			}
			if (!was[v]) dfs(v);
		}
	}
}

void check()
{
    memset(was, 0, sizeof(was));
    for (int i = 0; i < 4; ++i) if (!was[i]) {
        sum = 0;
        cnt_deg = 0;
        dfs(i);
        if (cnt_deg != 4) {
            res = max(res, sum);
        }
    }
//    printf("res:%d\n", res);
}

//void print_all_edeges()
//{
//    for (int i = 0; i < 4; ++i) {
//        for (int j = 0; j <= i; ++j) {
//            if(e[i][j].size() > 0)
//            {
//                printf("i:%d, j:%d, size:%d\n", i + 1, j +1, e[i][j].size());
//            }
//        }
//    }
//    printf("\n");
//}
int main() {
	int n; cin >> n;

    res = 0;
    memset(min_v, 0xff, sizeof(min_v));
	for (int i = 0; i < n; ++i) {
		int u, v, c;
		cin >> u >> c >> v;
		deg[--u] ^= 1;
		deg[--v] ^= 1;
		e[u][v].push_back(c);
        if(c < min_v[u][v])
        {
            min_v[u][v]=c;
            min_v[v][u]=c;
        }
		if (u != v) e[v][u].push_back(c);
	}

    check();
    for (int j = 0; j < 4; j++)
    {
        for(int k = 0; k <= j; k++)
        {
            //delete one edge
            if(e[j][k].size() > 0)
            {
                auto i = e[j][k].begin();
//                printf("min_v[j][k] is :%d %d\n", min_v[j][k], min_v[k][j]);
                for(;i != e[j][k].end(); i++)
                {
                    if(*i == min_v[j][k])
                    {
                        e[j][k].erase(i);
                        break;
                    }
                }
                auto it = e[k][j].begin();
                if(j!=k)
                {
                    for(;it != e[k][j].end(); it++)
                    {
                        if(*it == min_v[k][j])
                        {
                            e[k][j].erase(it);
                            break;
                        }
                    }
                }
//                printf("after remove %d, %d\n", k + 1, j+ 1);
//                print_all_edeges();
                deg[j] ^= 1;
                deg[k] ^= 1;
                check();
                //add back after check
                e[j][k].push_back(min_v[j][k]);
                if(j!=k)e[k][j].push_back(min_v[j][k]);
                deg[j] ^= 1;
                deg[k] ^= 1;
//                printf("after recover\n");
//                print_all_edeges();
            }
        }
    }
	cout << res << endl;
	return 0;
}

 

一文搞定 GitHub SSH Key:生成、配置、好处全攻略 本文详细介绍了如何配置GitHub SSH Key,实现免密安全认证。主要内容包括:SSH协议的四大优势(免密登录、安全性高、稳定省心、支持自动化);Git身份配置步骤;检查本地SSH Key;生成RSA密钥对;添加密钥到SSH代理;复制公钥到GitHub;测试连接。配置完成后,开发者可通过SSH地址克隆仓库,实现push/pull全程免密操作。该方案显著提升Git使用效率,同时保障安全性,是开发者必备技能。 阅读详情

相关推荐

SAP S4业务伙伴(BP)实战指南:从角色分配到数据同步的完整流程

本文详细解析了SAP S4业务伙伴(BP)功能,从基础概念到实战操作,涵盖角色分配、数据同步及常见问题排查。通过BP机制,企业可高效管理客户、供应商等多重身份,实现数据共享和动态切换,显著提升主数据管理效率。特别适合SAP实施顾问和ERP管理员参考。

y2z3a4b5c的博客 870

Codeforces Round #508 (Div. 2) D. Slime【思维】

D. Slime time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output There are nn slimes in a row. Each slime has an integer value (possibly ...

DNMTOOBA的博客 719

习题6-3 使用函数输出指定范围内的完数

其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[mn]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

cutto的博客 863

Codeforces Round #508 (Div. 2) D. Slime

题目大意:   给定一個数组,每次操作可以让其中任意的一个数x,吞并他的相邻的一个数y。吞并后,被吞的数消失,x的值变成x-y,重复此操作直到剩下一个数,求剩下的数的可能的最大值。 思路: 分三种情况,全正,全负,有正有负   有正有负,那么就总能让负数吞正数,得到一个绝对值更大的负数,並且吞并后的绝对值是它们的绝对值的和,例如-x吞并y,就的到-x-y = -(x+y),直到剩下一个正数时...

Ostrichcrab的博客 284

在 Dify 平台部署一个 知识库问答(KBQA) 工作流

加强检索约束,Prompt 加限制(“仅基于知识库回答”):启用缓存,使用轻量级 LLM(如 Mistral-7B)(OpenAI Embedding、M3E、BGE等)(支持 PDF/TXT/Markdown/Word)(GPU/CPU 资源,用于向量数据库和模型推理)企业内部文档(PDF/Word/Excel)网页爬取数据(Markdown/HTML)分块大小(太小→信息碎片化,太大→噪声多)相似度阈值(太高→漏检,太低→噪声多)(是否返回正确文档)结构化数据(数据库/API)

井底小蛙的博客 1520

从零构建XVC协议栈:FPGA+W5300的跨界调试架构实战

本文详细介绍了如何从零构建XVC协议栈,通过FPGA与W5300以太网控制器的创新组合实现跨界调试架构。重点解析了JTAG时序逆向、TCP/IP协议栈集成与XVC协议实现,提供了硬件设计优化和性能加速技术,为嵌入式开发者和FPGA工程师提供实用的远程调试解决方案。

raspberrypi5的博客 247

Codeforces Round #508 (Div. 2) A. Equality

problem link:http://codeforces.com/contest/1038/problem/A 题意:给你一个含有n个字符的字符串,其中该字符串由字母表的前k个字母随意组合而成。求这个字符串中从A到A+K-1个字符中最少的那个字母的数量乘以k。代码敲出来的时候刚过比赛不到7分钟,交上去就已经十分钟了,看到题目已经过了两分钟。我的电脑怕不是有毒了。 题意讲完就很简单啦。 AC...

Light2Chasers的博客 336

ubuntu20.4源码安装最新gcc(gcc V12.2)

Ubuntu20.4自带的gcc为V9.4.0的版本,老版本的gcc存在不支持新版本C语言规范,在配置、编译、安装应用软件或工具时,可能存在不能正确安装的问题。(比如:libpqxx-7.7.4在配置时要求c++17版本的支持,但gcc V9.4.0版本不支持c++17)。因此本文介绍ubuntu20.4的系统下载最新gcc12.2版本源码,并进行本地编译、安装。本节内容包括gcc12.2的必备库安装和gcc12.2安装两部分内容组成。

q544344318的博客 1万+

Codeforces Round #508 (Div. 2) C Gambling

题目大意:两个玩家都有n个整数,每个玩家可以从自己的数中选一个,这个数将加在自己的分数中,也可以去掉对方玩家的一个数,轮到对方玩家时对方玩家就不能再加那个数到分数中,因为已经去掉了,A和B玩家都以最优策略是彼此的差值最大,求最后的分数 题目链接:http://codeforces.com/contest/1038/problem/C 思路:对A,B玩家的数字进行排序,如果先手玩家为为A,若A的最大...

一只谜谜怪的博客 242

伺服系统控制原理深度解析

摘要:本文系统阐述了伺服系统的控制原理与应用。首先介绍了伺服系统的定义、组成及其在工业自动化中的重要性;然后详细分析了反馈控制机制、稳定性判据和性能指标;重点推导了传递函数和状态空间两种数学模型,并通过LaTeX公式展示了二阶系统建模过程;进而对比了PID控制、状态反馈及自适应控制等方法的优缺点;最后结合数控机床等案例,验证了理论方法的有效性,并展望了伺服系统智能化发展趋势。全文兼顾理论深度与实践指导性,为控制工程领域提供了系统的技术参考。

技术工作者 1266

Qt5+Ros+GUI界面

在之前建立的工程的基础上添加一个gui界面。 在ros包中新建一个文件夹,名字叫gui 右击gui文件夹添加一个文件,选择Qt->Qt设计师界面类 选择MainWindow 选择下一步 最后在gui中生成三个文件 mainwindow.cpp、mainwindow.h、mainwindow.ui 但此时,这些新创建的文件和原本的ros工程还没建立任何关系,只是目录下多出了几个文件而已...

二毛的博客 8843

【Codeforces Round #508div2】(A,B,C,D)

A. Equality time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output You are given a string s of length n , which consists only of the firs...

duanghaha的博客 699

Colmap论文——《Structure-from-Motion Revisited》论文阅读笔记

  最近又将Colmap论文翻出来仔细阅读总结了一下,于是顺便写个博客记录一下。Structure-from-Motion Revisited是当前SOTA的增量式SfM算法Colmap的论文,发表于2016年计算机视觉顶会CVPR。它是增量式SfM里程碑式的作品。 论文地址:https://openaccess.thecvf.com/content_cvpr_2016/papers/Schonberger_Structure-From-Motion_Revisited_CVPR_2016_paper.p

zeeq的博客 1万+

Codeforces Round #508 (Div. 2) (A,B,C,D)

    Codeforces Round #508 (Div. 2) A. Equality:Codeforces 1038A. Equality(水题) Codeforces Round #508 (Div. 2) B. Non-Coprime Partition:Codeforces 1038B. Non-Coprime Partition(暴力) Codeforces Round #...

Charles_Zaqdt的博客 392

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

[Codeforces Round #508 (Div. 2)][Codeforces 1038E. Maximum Matching]

前几天给舍友讲这题的时候感觉挺有意思的,就贴上来吧... 题目链接:1038E - Maximum Matching 题目大意:有\(n\)个棒子,每个条两端有颜色\(c1,c2\)以及他的价值\(v\),要求选取若干个棒子拼接起来(要求连接处的颜色相同,棒子可以反转),求最大价值总和。 题解:设\(c1==c2\)的为同色棒子,反之为异色    可以发现偶数个异色棒子可以拼为一...

170

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Codeforces Round #508 (Div. 2) D Slime

题目大意:给出n个数,每次可以取出两个数x和y(两个数从数组中删除),生成一个新数x-y放入原数组,求最后产生的最大值(总体大概是这个意思) 题目链接:http://codeforces.com/contest/1038/problem/D 思路:分成三种情况,如果n个数都是负数,则答案为最大数以外的所有数之和加最大数,如果n个数都是正数,最答案为除去最小数以外的所有数之和减去最小数,如果有正数有...

一只谜谜怪的博客 194

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Codeforces Round #508 (Div. 2) C D

C:C - Gambling 给你两个数列 每一回合A可以选择从第一个序列里面选一个数或者清除第二个序列里面选一个数 同理B能从第二序列里面选数或者清除第一个序列里面一个数 然后 求A所选的数之和-B所选数之和最大 贪心就行 两个优先队列每次比较另外一个序列最大的数是比自己序列最大的数大还是小 大就删除另一个序列的数 小就加上自己序列最大的数 可能会爆int QAQ ...

dianzanji4884的博客 112

Codeforces Round #508 (Div. 2) E. Maximum Matching(欧拉路径)

E. Maximum Matching 题目链接:https://codeforces.com/contest/1038/problem/E 题意: 给出n个项链,每条项链左边和右边都有一种颜色(范围1~4),然后每条项链都有对应的价值。 现在你可以任意改变项链的位置,也可以交换左右两边的颜色,问怎么做才能得到最大的价值。一条项链得到价值,就要求其左边的颜色和左边的项链右边颜色...

dft539533的博客 156

Codeforces Round #508 (Div. 2) D. Slime 枚舉

time limit per test 2 seconds memory limit per test 256 megabytes There arenslimes in a row. Each slime has an integer value (possibly negative or zero) associated with it. Any...

baiduguge2015的博客 212

【Codeforces Round #508 (Div. 2)】Slime【简单贪心】

题意:        一个数组,长度小于5*1e5,每一次你都可以选择数组中的一个数字,用这个数字将它左右两边相邻的数字吃掉,则被吃掉的数字消失,当前数字的权值变为x-y,使得最后数组中只剩一个元素的时候,使那个元素最大,询问元素最大值。   思路:        其实本题就是一个简单贪心,只需要进行一下简单的分类讨论。 1.如果序列中的数有正有负,则答案为序列中所有数字绝对值之和。 ...

lucius-liu.cn 453

Codeforces Round #508 (Div. 2) A Equality

大意:找到符合条件的最长子序列的长度,该序列包含前k个字母,并且每个字母出现的次数相等 用map水水就过了,维护前k个字母出现次数的最小值,在乘以k就好啦 #include&lt;stdio.h&gt; #include&lt;string.h&gt; #include&lt;algorithm&gt; #include&lt;iostream&gt; #include&lt;math....

Ostrichcrab的博客 188

Codeforces Round #508 (Div. 2) B. Non-Coprime Partition

problem link:http://codeforces.com/contest/1038/problem/B 题意:给你一个n,让你将从1~n这n个数分为两部分,使得两部分的和的最大公约数不为1。观察发现,只要把前n-1个数分成一个组,然后n分成一个组,然后n==1和n==2的情况特殊处理就好了。 证明一下这个为什么是正确的: 当n&gt;=3时 前n-1个数的和为(n-1)*n/2...

Light2Chasers的博客 463
上一篇: Educational Codeforces Round 50 (Rated for Div. 2)
下一篇: Codeforces Round #509 (Div. 2) 解题报告
john-zeng
博客等级 码龄16年 44粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值