Codeforces 1027 Div3(ABCDEF)

前言

无敌!!第一次打Div3,因为之前打Div4赛时也就三四题,所以在打之前根本没想到自己能做到赛时三题!!虽然第三题是离结束十几秒的时候交的,没想到判完题比赛结束了还不算赛时通过……TvT

A. Square Year

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;void solve()
{string s;cin>>s;int num=0;for(int i=0;i<4;i++){num=num*10+s[i]-'0';}int sq=sqrt(num);if(sq*sq==num){cout<<0<<" "<<sq<<endl;}else{cout<<-1<<endl;}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

这个题说实话有点恶心,感觉一开始题意不是很明确,没写随便输出一个即可,所以还对着用例想了半天。

随便输出一个那就简单了,那就是如果能开方就直接输出0和开平方后的数,不能就直接-1即可。

B. Not Quite a Palindromic String

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;//赛时暴力解
void solve1()
{int n,k;cin>>n>>k;string s;cin>>s;int m=s.length();if(k>m/2){cout<<"NO"<<endl;return ;}int cnt=0,cntA=0,cntO=0,cntX1=0,cntX2=0;for(int i=0,j=m-1;i<=j;i++,j--){if(s[i]!=s[j]){if(s[i]=='1'){cntX1++;}else{cntX2++;}}else if(s[i]==s[j]){if(s[i]=='1'){cnt++;cntA++;            }else{cnt++;cntO++;}}}if(cnt==k){cout<<"YES"<<endl;return ;}if((k%2==0&&cnt%2==0)||(k%2==1&&cnt%2==1)){if(k<cnt){if(min(cntA,cntO)>=(cnt-k)/2){cout<<"YES"<<endl;return ;}else{cout<<"NO"<<endl;return ;}}else{if(max(cntX1,cntX2)>=(k-cnt)/2){cout<<"YES"<<endl;return ;}else{cout<<"NO"<<endl;return ;}}}else{cout<<"NO"<<endl;return ;}}//优化解
void solve2()
{int n,k;cin>>n>>k;string s;cin>>s;int m=s.length();//因为要求k对“00”或“11”,所以剩下的n/2-k对都是“01”//所以保证0和1的数量减去n/2-k是偶数即可//统计出现次数vector<int>cnts(2);for(int i=0;i<m;i++){cnts[s[i]-'0']++;}int zeros=cnts[0]-(n/2-k);int ones=cnts[1]-(n/2-k);if(zeros>=0&&zeros%2==0&&ones>=0&&ones%2==0){cout<<"YES"<<endl;}else{cout<<"NO"<<endl;}
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve2();    }return 0;
}

这个题真的太草了,赛时完全想复杂了,虽然调了半天调出来了,但浪费了不少时间……

赛时想到的麻烦思路是,从要求的k和实际的cnt入手,分析两者奇偶性对结果的影响。因为交换后必然是两对两对地增加,两对两对地减少,所以只有当k和cnt奇偶性一致时才有可能凑出来。(很妙,但没用)

之后就去讨论k和cnt的大小关系。当k小于cnt时,需要通过交换减少个数,那就只能让“00”和“11”交换,一次消去两对,所以就要分别统计“00”和“11”的个数。只有当这俩个数的最小值比k和cnt差值的两倍大时才有可能凑出来。

当k大于cnt时,就需要通过交换增加个数,此时就需要让“01”和“10”的组合交换。注意,在上一个情况里,必须是在同一侧的两数交换,才能减少个数,所以是两者最小值。而这里,除了上述情况,还可以让两对“01”中其中一组的“0”和另一组的“1”交换,仍然可以消去一对。所以在这里就是取两者的最大值,要注意的是,这里需要在一开始进行剪枝,先把k大于m/2的情况剪了才行。

优化解就简单很多了,因为匹配的情况就是“00”和“11”两种,不匹配就是“01”和“10”两种,所以当要求有k对匹配时,不匹配的数量就是n/2-k。所以考虑先统计一遍0和1的词频,之后减去不匹配的数量就是需要的数量。当两者都大于0且是偶数时,就可以被交换出来。

怎么说呢,感觉这个优化解的思路太需要观察了……我赛时还想着怎么个调换法,这个直接从一般规律入手了,差距好大……

C. Need More Arrays

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;void solve()
{int n;cin>>n;vector<int>a(n);for(int i=0;i<n;i++){cin>>a[i];}vector<int>b;b.push_back(a[0]);for(int i=1,j=0;i<n;i++){if(a[j]+1<a[i]){b.push_back(a[i]);j=i;}}cout<<b.size()<<endl;;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

这个题纯纯贪心,本来以为没戏了,没想到最后二十分钟真给我贪出来了,还是一发过。(骄傲)

根据原题意,其实就是要让这个数组不连续。那么贪心的思路就是,从前往后遍历这个数组,一旦发现有连续的部分就直接删除靠后的元素,因为这样只会导致后续可能对答案有增益,不会导致答案减少。(说实话,我都不知道我咋能想到这个贪心)

所以就是遍历数组,设置指针j记录上一个没删除的下标。然后如果连续就删除,否则就加到新数组里,然后j来到当前位置,最后返回新数组的大小即可。

D. Come a Little Closer

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;void solve()
{int n;cin>>n;vector<vector<ll>>mon(n,vector<ll>(2));for(int i=0;i<n;i++){cin>>mon[i][0]>>mon[i][1];}//特判if(n==1){cout<<1<<endl;return ;}ll ans=1e18+100;multiset<ll>xs,ys;for(int i=0;i<n;i++){xs.insert(mon[i][0]);ys.insert(mon[i][1]);}//计算所有的面积ans=min(ans,(*xs.rbegin()-*xs.begin()+1)*(*ys.rbegin()-*ys.begin()+1));//枚举每个移动的怪兽for(int i=0;i<n;i++){xs.erase(xs.find(mon[i][0]));ys.erase(ys.find(mon[i][1]));//统计可以缩小的答案ll tmp=(*xs.rbegin()-*xs.begin()+1)*(*ys.rbegin()-*ys.begin()+1);//剩余构成的长方形是满的if(tmp==n-1){//加上长宽的最小值 -> 移动到周围tmp+=min(*xs.rbegin()-*xs.begin()+1,*ys.rbegin()-*ys.begin()+1);}ans=min(ans,tmp);//放回去xs.insert(mon[i][0]);ys.insert(mon[i][1]);}cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

这个题因为不知道multiset所以还卡了一会……

multiset就是允许存在重复元素的set,因为最多可以移动怪兽一次,所以肯定考虑枚举每个怪兽,看看移动之后能否使答案减小。所以有了multiset就可以把所有点放到set里,然后每次根据set中的最小值和最大值把要删除的整个格子抓出来。之后枚举每个怪兽,每次先在set中删除,接着统计答案,最后插回去即可。注意,若格子满了,即面积等于怪兽的数量,那就让当前怪兽去到长宽更小的那边,需要增加的就是长宽的最小值。

E. Kirei Attacks the Estate

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;const int MAXN=200005;//链式前向星建树
// int head[MAXN];
// int nxt[MAXN<<1];
// int to[MAXN<<1];
// int cnt=1;// void build(int n)
// {
//     fill(head,head+MAXN,0);
//     fill(nxt,nxt+(MAXN<<1),0);
//     fill(to,to+(MAXN<<1),0);
// }// void addEdge(int u,int v)
// {
//     nxt[cnt]=head[u];
//     to[cnt]=v;
//     head[u]=cnt++;
// }//dfs
void dfs(int u,int father,vector<vector<ll>>&ans,vector<ll>&weight,vector<vector<int>>&graph)
{ans[u][0]=max(weight[u],weight[u]-ans[father][1]);ans[u][1]=min(weight[u],weight[u]-ans[father][0]);// for(int ei=head[u],v;ei>0;ei=nxt[ei])// {//     v=to[ei];//     if(v!=father)//     {//         dfs(v,u,n,weight);//     }// }for(int cur:graph[u]){if(cur!=father){dfs(cur,u,ans,weight,graph);}}
}void solve()
{int n;cin>>n;vector<ll>weight(n+1);for(int i=1;i<=n;i++){cin>>weight[i];}//build(n);vector<vector<int>>graph(n+1);for(int i=1,u,v;i<=n-1;i++){cin>>u>>v;// addEdge(u,v);// addEdge(v,u);graph[u].push_back(v);graph[v].push_back(u);}//0:max  1:minvector<vector<ll>>ans(n+1,vector<ll>(2,0));dfs(1,0,ans,weight,graph);for(int i=1;i<=n;i++){cout<<ans[i][0]<<" ";}cout<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

真的抽象,没想到链式前向星性能会比邻接表差好多,同样思路链式前向星直接TLE了……不过很好的一点是思路自己在补题的时候想到了!!

这个题其实就是个树型dp,观察给出的式子就能发现,当前节点的威胁值其实就是两种情况,自己单独和自己节点减去父节点的威胁值。而又因为要求当前节点的威胁值最大,所以就要求减去的父节点的威胁值最小。那么就考虑用dfs往下扎,同时收集当前节点威胁值的最大值和最小值即可。

F. Small Operations

#include <bits/stdc++.h>
using namespace std;typedef long long ll;
typedef pair<int,int> pii;//最大公约数
int gcd(int a,int b)
{if(b>a){int tmp=b;b=a;a=tmp;}return b==0?a:gcd(b,a%b);
}//质因子
vector<int>factors(int n)
{vector<int>ans;for(int i=2;i*i<=n;i++){while(n%i==0){if(ans.empty()||ans.back()!=i){ans.push_back(i);}n/=i;}}if(n!=1){ans.push_back(n);}return ans;
}//约数
vector<int>divisors(int n)
{vector<int>ans;for(int i=n;i>=1;i--){if(n%i==0){ans.push_back(n/i);}}return ans;
}//把1乘到n的最小次数 -> 贪心是不对的,正解是按乘积bfs展开路径
int check(int n,int k)
{if(n==1){return 0;}//往上乘的过程中,每一步的结果必然是n的约数vector<int>div=divisors(n);set<int>cur;//当前层结果cur.insert(1);for(int i=1;;i++){set<int>next;//下一层for(int x:cur){for(int y:div){if(y>k){break;}next.insert(x*y);}}if(next.find(n)!=next.end())//乘出n{return i;}cur=next;}return 0;
}void solve()
{int x,y,k;cin>>x>>y>>k;//先让两者同除一个最大公约数//之后先让x变为1,然后再乘到yint t=gcd(x,y);x/=t;y/=t;//若两者任意一个存在一个质因子大于k//那么不可能把x除到1或把1乘到y,所以必不可能完成for(int t:factors(y)){if(t>k){cout<<-1<<endl;return ;}}for(int t:factors(x)){if(t>k){cout<<-1<<endl;return ;}}int ans=check(x,k)+check(y,k);cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t=1;cin>>t;while(t--){solve();    }return 0;
}

数学题拼尽全力无法战胜了……

首先可以发现,上来可以求x和y的最大公约数,然后让两者同除这个最大公约数,然后考虑除完的结果,这样不会对答案造成影响。之后的思路是先把x除到1,再从1乘到y。所以,对于无法完成的情况,那就是要分别取两者的质因数,若存在一个质因子大于k,那么就必然不可能完成。判断完之后,因为从一个数除到1和从1乘到这个数是对称的,所以就是用一个check方法求x和y从1乘到该数的最小步数,加起来即可。

对于check方法,这里按k从大到小乘的贪心思路是不对的,正解是bfs展开路径。观察可以发现,在从1乘到该数的过程中,每一步的结果都必然是该数的因数,那么就可以先把该数的所有因数抓出来,接着用两个set分别存当前步数里能乘出来的结果和下一步能乘出来的结果。然后每次遍历当前层,若该数的因数没有大于k,就让该数的因数乘以当前层里的结果,然后存到下一层里。最后去找当前层里是否存在该数,有的话直接返回当前的步数,否则就让cur来到下一层。

G. Build an Array

G题饭老师的讲解没听懂……

总结

努力总会有回报!!加油!!再接再厉!!

END

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第九天:java注解

注解 1 什么是注解&#xff08;Annotation&#xff09; public class Test01 extends Object{//Override重写的注解Overridepublic String toString() {return "Test01{}";} }2 内置注解 2.1 Override Override重写的注解 Override public String toString() {ret…

【论文解读】Deformable DETR | Deformable Transformers for End-to-End Object Detection

论文地址&#xff1a;https://arxiv.org/pdf/2010.04159 代码地址&#xff1a;https://github.com/fundamentalvision/Deformable-DETR 摘要 DETR最近被提出&#xff0c;旨在消除物体检测中许多手工设计的组件的需求&#xff0c;同时展示出良好的性能。然而&#xff0c;由于T…

从0到1上手Trae:开启AI编程新时代

摘要&#xff1a;字节跳动 2025 年 1 月 19 日发布的 Trae 是一款 AI 原生集成开发环境工具&#xff0c;3 月 3 日国内版推出。它具备 AI 问答、代码自动补全、基于 Agent 编程等功能&#xff0c;能自动化开发任务&#xff0c;实现端到端开发。核心功能包括智能代码生成与补全、…

Vue项目打包常见问题

vue的前端项目中&#xff0c;有时候需要多个不同项目合并到一起。有时候有一些特殊要求。 1、打包后不允许生成带 .map的文件 正常使用npm run build命令打包生成的dist文件中&#xff0c;js文件总会生成一个同名的.map文件&#xff0c;原因如下&#xff1a; ‌总结‌&#xf…

Linux 学习-模拟实现【简易版bash】

1、bash本质 在模拟实现前&#xff0c;先得了解 bash 的本质 bash 也是一个进程&#xff0c;并且是不断运行中的进程 证明&#xff1a;常显示的命令输入提示符就是 bash 不断打印输出的结果 输入指令后&#xff0c;bash 会创建子进程&#xff0c;并进行程序替换 证明&#x…

GitHub 趋势日报 (2025年05月31日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 1153 prompt-eng-interactive-tutorial 509 BillionMail 435 ai-agents-for-begin…

“人单酬“理念:财税行业的自我驱动革命

引言&#xff1a;当薪酬不再是"固定数字"&#xff0c;而是"成长标尺" "为什么有人拼命工作却收入停滞&#xff1f;为什么企业总在人才流失中挣扎&#xff1f;"这些问题背后&#xff0c;往往隐藏着传统薪酬体系的僵化。而"人单酬"&…

AI大模型赋能,aPaaS+iPaaS构建新一代数智化应用|爱分析报告

01 aPaaS和iPaaS成为企业用户关注重点 PaaS市场定义 根据Gartner的定义&#xff0c;PaaS&#xff08;Platform as a Service&#xff09;平台是应用基础架构&#xff08;中间件&#xff09;服务的广泛集合&#xff0c; 包含应用平台、集成、业务流程管理、数据服务和AI应用等…

WPS快速排版

论文包括&#xff08;按顺序&#xff09;&#xff1a;封面&#xff08;含题目&#xff09;、摘 要、关键词、Abstract&#xff08;英文摘要&#xff09;、Keywords、目录、正文、参考文献、在读期间发表的学术论文及研究成果&#xff0c;致 谢 题目&#xff08;黑小一加粗&…

python第39天打卡

1.灰度图像 作为图像数据&#xff0c;相较于结构化数据&#xff08;表格数据&#xff09;他的特点在于他每个样本的的形状并不是(特征数&#xff0c;)&#xff0c;而是(宽&#xff0c;高&#xff0c;通道数) # 先继续之前的代码 import torch import torch.nn as nn import t…

win11小组件功能缺失的恢复方法

问题说明&#xff1a;重置了win11系统&#xff0c;结果小组件功能找不到了&#xff0c;最后用以下办法解决。 1. 以管理员身份打开 PowerShell 或 CMD。 2. 运行以下命令&#xff1a; winget install 9MSSGKG348SP 注&#xff1a;如果报错&#xff0c;可尝试先卸载再安装…

Kali Linux从入门到实战:系统详解与工具指南

一、Kali Linux简介 Kali Linux是一款基于Debian的Linux发行版&#xff0c;专为渗透测试和网络安全审计设计&#xff0c;由Offensive Security团队维护。其前身是BackTrack&#xff0c;目前集成了超过600款安全工具&#xff0c;覆盖渗透测试全流程&#xff0c;是网络安全领域…

C语言 — 文件

目录 1.流1.1 流的概念1.2 常见的的流 2.文件的打开和关闭2.1 fopen函数2.2 fclose函数2.3 文件的打开和关闭 3.文件的输入输出函数3.1 fputc函数3.2 fgetc函数3.3 feof函数和ferror函数3.4 fputs函数3.5 fgets函数3.6 fwrite函数3.7 fread函数3.8 fprintf函数3.9 fscanf函数 4…

Pull Request Integration 拉取请求集成

今天我想要把我创建的项目&#xff0c;通过修改yaml里面的内容&#xff0c;让我在main分支下的其他分支拉取请求的时候自动化测试拉取的内容&#xff0c;以及将测试结果上传到控制台云端。 首先我通过修改yaml文件里面的内容 name: Build and Teston:push:branches:- mainjobs:…

NodeJS全栈开发面试题讲解——P3数据库(MySQL / MongoDB / Redis)

3.1 如何用 Node.js 连接 MySQL&#xff1f;你用过哪些 ORM&#xff1f; 面试官您好&#xff0c;我先介绍如何用 Node.js 连接 MySQL&#xff0c;然后补充我常用的 ORM 工具。 &#x1f50c; 原生连接 MySQL 使用 mysql2 模块&#xff1a; npm install mysql2 const mysql …

Redis最佳实践——性能优化技巧之数据结构选择

Redis在电商应用中的数据结构选择与性能优化技巧 一、电商核心场景与数据结构选型矩阵 应用场景推荐数据结构内存占用读写复杂度典型操作商品详情缓存Hash低O(1)HGETALL, HMSET购物车管理Hash中O(1)HINCRBY, HDEL用户会话管理Hash低O(1)HSETEX, HGET商品分类目录Sorted Set高O…

题单:最大公约数(辗转相除法)

题目描述 所谓 “最大公约数&#xff08;GCD&#xff09;” &#xff0c;是指所有公约数中最大的那个&#xff0c;例如 12 和 1818 的公约数有 1,2,3,6 &#xff0c;所以 12 和 18 的最大公约数为 6 。 辗转相除法&#xff0c;又名欧几里德算法&#xff08;Euclidean Algorit…

hadoop完整安装教程(附带jdk1.8+vim+ssh安装)

本篇带领大家在uabntu20虚拟机上安装hadoop&#xff0c;其中还包括jdk1.8、ssh、vim的安装教程&#xff0c;&#xff08;可能是&#xff09;史上最全的安装教程&#xff01;&#xff01;&#xff01;若有疑问可以在评论区或者私信作者。建议在虚拟机上观看此博客&#xff0c;便…

Flutter、React Native、Unity 下的 iOS 性能与调试实践:兼容性挑战与应对策略(含 KeyMob 工具经验)

移动端跨平台开发逐渐成为常态&#xff0c;Flutter、React Native、Unity、Hybrid App 等框架在各类 iOS 项目中频繁出现。但随之而来的&#xff0c;是一系列在 iOS 设备上调试难、性能数据采集难、日志整合难的问题。 今天这篇文章&#xff0c;我从实际项目出发&#xff0c;聊…

PyCharm接入DeepSeek,实现高效AI编程

介绍本土AI工具DeepSeek如何结合PyCharm同样实现该功能。 一 DeepSeek API申请 首先进入DeepSeek官网&#xff1a;DeepSeek 官网 接着点击右上角的 “API 开放平台“ 然后点击API keys 创建好的API key&#xff0c;记得复制保存好 二 pycharm 接入deepseek 首先打开PyCh…