codeforce第874轮(div3)

news/2024/10/21 4:02:08/

地址:codeforce第84轮(div3)

A:

题目的意思是:给定我们一堆包含两个字符的字符串,字符串a和字符串b只要a的后一个字母和b的前一个字母相等即可链接,现在给出最后链接好的字符串,问我们最少能用多少个形如a和b的字符串可以链接;

实际上就是问我们,用多少个包含两个字符的字符串可以构造出答案,可以直接把所有情况写出来,去重即可;

这里可以直接用set去重,你也可以用map,反正哈希表基本都可以

代码如下:

#include<iostream>
#include<set>
using namespace std;
set<string> a;
int main()
{int t;cin>>t;while(t--){a.clear();int n;string arr;cin>>n;cin>>arr;
//		cout<<arr<<endl;for(int i=1;i<arr.size();i++){string k="";k+=arr[i-1];k+=arr[i];
//			cout<<k<<endl;a.insert(k);}cout<<a.size()<<endl;}} 

B:

b题乍一看我们需要找到一个b数组的一个序列,使得a和b的差值能够小于k;

这里我们考虑暴力写法,如果暴力的话我们需要枚举所有情况,因为b的某个数分配给a的某个数之后可能造成a的另一个数得不到分配,这是可能存在的;比如a={3,7},b={8,1},k=5,第一次选择会把8分给3,但是接下来1不能分配给7,但是我们发现把1分给3,把8分给3是可以的;

所以这道题到这里的分析大家也就看出来了;

因为我们保证题目有解,所有我们把a排序之后,把b排序之后,如果bi+1能分配给ai,那么bi一定能分配给ai。前面情况一样,这样我们就得到了一种最优算法,虽然答案不唯一,但是这种情况很好写。

开个struct,一个变量存a的值,一个存位置,进行a和b的排序之后,再根据结构体位置信息把b按照顺序输出,我这里是开了一个数组再存了一次。

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct ST
{int k;int si;
}a[100010];
int ans[100010];
int b[100010];int cmp(ST a,ST b)
{return a.k<b.k;
}int main()
{int t,m;cin>>t;while(t--){int n;cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i].k;a[i].si=i;}for(int i=1;i<=n;i++){cin>>b[i];}sort(a+1,a+n+1,cmp);sort(b+1,b+n+1);for(int i=1;i<=n;i++){ans[a[i].si]=b[i];}for(int i=1;i<=n;i++) cout<<ans[i]<<' ';cout<<endl;}
}

C:

首先题目让我们构造出全奇数或者全偶数序列,这个时候我们就要考虑给我们的序列的分布情况,首先全是奇数和全是偶数肯定是有答案的,直接输出YES,这里我们思考有奇数和有偶数的情况,我们思考能否构造出偶数数列;

显而易见这是不可能的,因为奇数减奇数为偶数,你可以用大的奇数减小的奇数得到偶数,但是会剩下最后一个最小的奇数没法减去,所以可以思考构造奇数序列,这里我们发现奇数序列只需要用偶数减去最小的奇数就可以构造。所以不成立的情况就是,存在一个偶数小于最小的奇数。

直接进行遍历,存下奇数个数,偶数个数,奇数最小值,偶数最小值,当偶数最小值小于奇数最小值一定无解即可;

代码:

#include<iostream>using namespace std;int arr[200010];int main()
{int t;cin>>t;while(t--){int n,ji=0x3f3f3f3f,ou=0x3f3f3f3f,inj=0,ino=0;cin>>n;for(int i=1;i<=n;i++){int k;cin>>k;if(k%2) inj++,ji=min(k,ji);else ino++,ou=min(ou,k);}if(!inj||!ino) cout<<"YES"<<endl;else {if(ou<ji) cout<<"NO"<<endl;else cout<<"YES"<<endl;}}
}

D:

这道题目需要好好思考一下,题目告诉我们需要找到其中一个区间进行反转,再把前后交换得到答案,这里我们想,如何才能使字典序最大呢?

肯定是要先把最大的数字放在最前面,那么根据这个情况,我们能找到两种解决方案,一种是找到最大数字的前一个,让他变成r位置,遍历l位置,模拟reverse过程计算一个答案。还有一种情况就是选择最大值,这个时候只会在最大值在最后一个数的时候成立,因为如果最大数不在最后一个位置,你选择以后交换前后值得时候肯定有数字在最大值前面,所以这个不可以。

还有一种情况是最大值在最前面,因为我们进行选择的时候,反转的数组一定在最大值前面,所以当最大在第一个,你的数组是一定会把最大值调到后面的,这个时候我们就要考虑次最大值了。

我们可以选择次最大值,这样次最大值进行选择的时候还是会把最大值移位,并且在次最大值排最前面的选择里,一定可以达到最大;

写法就是模拟上述这个过程

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;int n,ma=0,si=0;
const int N=2010;
int pd[N],arr[N],b[N];
int ans[N];int rever(int l,int r)
{for(int i=l,j=r;i<j;i++,j--){swap(b[i],b[j]);}
}
int cun(int l,int r)
{int o=1;for(int i=r;i<=n;i++) pd[o++]=b[i];for(int i=l+1;i<=r-1;i++) pd[o++]=b[i];for(int i=1;i<=l;i++) pd[o++]=b[i];
}int pdsw()
{int flag=0;for(int i=1;i<=n;i++){if(pd[i]>ans[i]){flag=1;break;}else if(pd[i]<ans[i]){flag=0;break;}}if(flag){for(int i=1;i<=n;i++) ans[i]=pd[i];}
}int main()
{int t;cin>>t;while(t--){memset(ans,0,sizeof(ans));ma=0,si=0;cin>>n;for(int i=1;i<=n;i++){cin>>arr[i];if(arr[i]>ma) ma=arr[i],si=i;}if(si==1){for(int i=1;i<=n;i++){if(arr[i]==ma-1) {si=i;break;}}}for(int i=si-1;i>=1;i--) {
//			cout<<i<<' '<<si-1<<endl;for(int j=1;j<=n;j++) b[j]=arr[j];rever(i,si-1);//			for(int j=1;j<=n;j++) cout<<b[j]<<' ';
//			cout<<endl;cun(i-1,si);pdsw();}for(int i=si;i>=1;i--) {
//			cout<<i<<' '<<si<<endl;for(int j=1;j<=n;j++) b[j]=arr[j];rever(i,si);//			for(int j=1;j<=n;j++) cout<<b[j]<<' ';
//			cout<<endl;cun(i-1,si+1);pdsw();}for(int i=1;i<=n;i++) cout<<ans[i]<<' ';cout<<endl;}
}

E:

这道题目有很强的思维性。

我们首先考虑,每个点只知道他的一个邻居,不知道另一个邻居,这样我们需要查找到最大的和最小的围圈跳舞的人是多少。我们把这个点和他们的邻居连起来,我们会发现有些成环了,而有些没有成环却成边。

如果你多测几组样例很容易就能发现一个问题,一个点不可能和3个及以上点相连,因为那样会造成邻居错误,所以当某一条链成环,她肯定会绕回去。而其他情况也只会成一条竹子型的边,我们下边都简称边。

一个环是一种情况,所有边最小可以成一个环也可以没有,最大每一条边连一个环,边数就等于环数。

我们如何找成边和成环的情况呢?

首先可以用无向图来做,用无向图来存的话,成环说明这条边至少有两个出边,成边说明有一个点只有一条边,可以直接判断不是上一个节点的话,没有节点了,就是边,如果还有并且重复了就是环。

也可以直接从某一个点进入,把这条边或者环所有点存进去,左后判断,只要有一个点只有一条出边就是错误。。

这样我们无论根据上述那种方法都可以计算出来;

这里我使用的是第二种方法;

代码如下:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#include<queue>
using namespace std;typedef long long LL;
const int N=200010;int main()
{int t;cin>>t;while(t--){int n;cin>>n;vector<set<int>> g(n);vector<int> a(n);vector<int> d(n);for(int i=0;i<n;i++){cin>>a[i];a[i]--;g[i].insert(a[i]);g[a[i]].insert(i);}for(int i=0;i<n;i++) d[i]=g[i].size(); int ba=0,cir=0;vector<int> vis(n);for(int i=0;i<n;i++){if(!vis[i]){queue<int> q;q.push(i);vis[i]=1;vector<int> ans = {i};while(!q.empty()){int u=q.front();q.pop();for(auto v:g[u]){if(!vis[v]){vis[v]=1;q.push(v);ans.push_back(v);}}}int bam=0;for(auto it:ans){if(d[it]==1){bam=1;break;}}if(bam) ba++;else cir++; }}cout<<cir+min(1,ba)<<' '<<cir+ba<<endl;}}


http://www.ppmy.cn/news/90006.html

相关文章

〖Web全栈开发⑤〗— CSS基础

〖Web全栈开发⑤〗— CSS基础 (一)CSS基础1.1CSS介绍1.2CSS样式1.3CSS 格式 &#xff08;二&#xff09;CSS 选择器2.1标签选择器2.2类选择器2.3层级选择器2.4id选择器2.5组选择器2.6伪类选择器2.7通配符选择器 &#xff08;三&#xff09;样式表引入3.1外部样式表3.2内部样式表…

二总线-MBus讲解

二总线的叫法演变是从多线到总线再到二总线这么一个过程&#xff0c;尤其在楼宇的消防领域&#xff0c;报警的设备总线基本已经是二总线了&#xff0c;其特点就是电源与通信一起传输&#xff0c;本质上是一个电力载波的思路。那么现在的powerbus二总线又是一个极端&#xff0c;…

知识变现海哥:如何把自己的想法变现?

高手都懂得&#xff0c;简单三招&#xff0c;卖掉自己的想法。 把自己的思维装入别人的大脑&#xff0c;把别人的钱装进自己的口袋。 招一&#xff1a;把已知的事情和知识&#xff0c;变成未知的。 网络自媒体大行其道&#xff0c;你经常会看到听到一些新名词&#xff0c;仔细…

学习go的操作(本人已有c的基础,请思考后再看)

建立一个文件&#xff08;我的第一个文件是hellow.go&#xff09;&#xff0c;后在终端执行一下几步&#xff1a;我用的是go build先编译成了可执行文件&#xff08;.exe&#xff09;【1.go build hellow.go 2.hellow.exe】。当然&#xff0c;你也可以用go run直接运行【…

00后学什么技术有前途?2023年Java和前端发展前景分析!

00后的你还在想着进厂吗&#xff1f;每天在流水线上打螺丝&#xff0c;过着一成不变的日子&#xff0c;而且每个月就休息那么几天。如果你不想进厂&#xff0c;特别是对那些20岁刚出头或者学历不是那么有优势的年轻人&#xff0c;好程序员建议还是应该去学习一门技术&#xff0…

论文解读 | IROS 2022:MV6D:在RGB-D图像上使用深度逐点投票网络进行多视角6D姿态估计

原创 | 文 BFT机器人 01 研究背景 在计算机视觉领域&#xff0c;6D姿态估计是一种重要的任务&#xff0c;用于确定物体在3D空间中的位置和方向。它在许多应用领域具有广泛的应用&#xff0c;如机器人操作、虚拟现实、增强现实、物体跟踪等。 然而&#xff0c;传统的6D姿态估计方…

VMWare ESXI6.7创建虚拟机

VMware ESXi&#xff1a;专门构建的裸机 管理程序 首先开启ESXI主机 登录ESXI 打开浏览器输入物理机ip&#xff0c;输入账号密码进行登录 创建虚拟机 选择创建类型 创建RedHat7.6 选择存储类型和数据存储 仅一个存储&#xff0c;直接点下一页即可 配置虚拟机硬件和虚拟机附…

高速高密PCB高级验证技巧(四): 扫除信号线的意外回音

现今电子产品复杂度越趋增加&#xff0c;信号速度越来越快&#xff0c;在信号传输的过程中&#xff0c;如果信号不断反射便会对电子产品的运作造成影响&#xff0c;而这又与阻抗连续性以及阻抗匹配息息相关&#xff1b;而如何避免信号反射&#xff0c;除了在硬件设计时的规划外…