Codeforces Round 950 (Div. 3)(A~E题解)

2024-06-04 20:44
文章标签 codeforces round div 题解 950

本文主要是介绍Codeforces Round 950 (Div. 3)(A~E题解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这场比赛我自己打的是真的垃圾,也是侥幸被拿下了,第三题当时没想清楚,要不然还能止损一下,惜败惜败

话不多说,现在来看A~E题的题解

A. Problem Generator

题解:这题水题一个,我们来考虑本题的做法,题目说 给我n个问题,然后有m轮比赛,每轮比赛都需要A~G道题,那么我们之间去用数组去统计每道题的出现的次数即可,然后对于对于每个问题我们需要判断其出现次数是否小于m,若小于m则还需要出对应的m-vis[i]道题

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m;
char s[55];
int vis[10];//用来统计每个问题都出现了多少次
signed main()
{cin>>t;while(t--){memset(vis,0,sizeof(vis));cin>>n>>m;for(int i=1;i<=n;i++){cin>>s[i];vis[s[i]-'A'+1]++;}int cnt=0;for(int i=1;i<=7;i++){if(vis[i]<m)cnt+=m-vis[i];}cout<<cnt<<"\n";}return 0;
}

B. Choosing Cubes 

题解:题目意思是我们有n个小立方体,每个立方体有自己的大小,然后我钟情于索引为f的立方体,然后,我们对这个数组进行排序(从大到小),然后那走前n个,判断我钟情的立方体是否会被拿走,如果一定被拿走就输出YES,如果一定不被拿走就输出NO,如果有可能被拿走,也有可能不被拿走就输出MAYBE

我们对立方体进行排序,设立一个flag初始值为0,然后遍历遍历数组索引从1到k然后去看是否里面有和钟情的立方体大小一样的,如果有则flag=1;如果没有那就说明一定抽不到我喜欢的立方体,输出NO即可

然后我们再遍历一遍k+!到n,如果还有立方体和钟情的立方体一样大小,且flag=1,那么就说明有可能被选走,也有可能没被选走,就是MAYBE,如果没有,就说明只有一个所有和钟情立方体一样大小的都在前面,一定会被选走,输出YES

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,f,k;
int a[105];
bool cmp(int a,int b)
{return a>b;
}
signed main()
{cin>>t;while(t--){cin>>n>>f>>k;for(int i=1;i<=n;i++)cin>>a[i];int flag=a[f];//记录喜欢的立方体sort(a+1,a+n+1,cmp);int cnt=0;for(int i=1;i<=k;i++){if(a[i]==flag)cnt=1;}for(int i=k+1;i<=n;i++)if(a[i]==flag&&cnt==1)cnt=2;if(cnt==1){cout<<"YES"<<"\n";}else if(cnt==0){cout<<"NO"<<"\n";}else{cout<<"MAYBE"<<"\n";}}return 0;
}

 C. Sofia and the Lost Operations

 题解:这题就是说一开始给了三个数组,a数组,b数组,d数组,我们可以将a数组的任意值变成d数组里面的,但是d数组是按顺序变的,第一个变得就是d[1],第二个就是d[2]

然后问我们,a数组能不能变成b数组,这题一开始很快就想出来了,但是犯蠢了,考虑错范围了,等下我在下面思路仔细讲解

首先我们做这题的思路就是想着看d数组能不能包含所有a变b数组的值,然后,如果全部包含,那就说明可以,如果不完全包含,就说明不可以,但是这样真的对吗

显然是不对的,因为对于最后一个数据来看,我们需要让d数组的最后一位是b数组里面的一个子元素(当时我这个小丑,想的是d数组的最后一位必须是要变换的b数组的元素,直接把范围卡小了,所以错了)

所以这题的思路就是先判断d数组的最后一位是不是b数组里面的子元素,如果不是那么一定就是错的,如果是,再判断m次从操作能否让所有的需要变的a数组元素都能变成b数组元素

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
int a[200005];
int b[200005];
int m;
set<int> st;
map<int , int> mp;
vector<int> vec;
signed main()
{cin>>t;while(t--){st.clear();mp.clear();vec.clear();cin>>n;for(int i=0;i<n;i++)cin>>a[i];for(int i=0;i<n;i++){cin>>b[i];st.insert(b[i]);if(b[i]!=a[i]){mp[b[i]]++;}}cin>>m;int num;for(int i=0;i<m;i++){cin>>num;vec.insert(vec.begin() + i, num);}if(st.count(vec[vec.size()-1])){for(auto it : vec){mp[it]--;}int flag=1;for(auto it : mp){if(it.second>0)flag=0;}if(flag==1)cout<<"YES"<<"\n";elsecout<<"NO"<<"\n";}else{cout<<"NO"<<"\n";}}return 0;
}

 D. GCD-sequence

 

题解:将删除前的最大公因数序列求出来,可以发现若要满足题意,必然需要找到gcd序列中最后一个递减的位置,并且删除与之相关的数(只有三个数与之相关)。然后判断删除后的序列能否形成非递减即可。 

#include<bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n;
int a[200005];
int b[200005];
int sum[200005];
int ans[200005];int gcd(int a,int b)
{if(b==0){return a;}return gcd(b,a%b);
}bool solve()
{for(int i=1;i<=n-2;i++){ans[i]=gcd(sum[i],sum[i+1]);if(ans[i]<ans[i-1])return false;}return true;
}void titi()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=n-1;i++){b[i]=gcd(a[i],a[i+1]);if(b[i-1]>b[i]){for(int j=1;j<=i-2;j++){sum[j]=a[j];}for(int j=i;j<=n;j++){sum[j-1]=a[j];}if(solve()){return cout<<"YES"<<"\n",void();}for(int j=1;j<=i-1;j++){sum[j]=a[j];}for(int j=i+1;j<=n;j++){sum[j-1]=a[j];}if(solve()){return cout<<"YES"<<"\n",void();}for(int j=1;j<=i;j++){sum[j]=a[j];}for(int j=i+2;j<=n;j++){sum[j-1]=a[j];}if(solve()){return cout<<"YES"<<"\n",void();}return cout<<"NO"<<"\n",void();}}puts("YES");
}signed main()
{cin>>t;while(t--){titi();}return 0;
}

E. Permutation of Rows and Columns 

 

题解,这题就是说问你两个矩阵,能否让a矩阵通过若干次行变换和列变换,使其变成b矩阵,这题思路也很简单(但是比赛卡在C了,至今忘不了,我对那个d数组最后一个范围的错误,悲哉

思路就是既然就是单纯的行变换和列变化,那我,只要a矩阵的每一行的和在b矩阵能全部出现就行 ,列同理,

然后

#include <bits/stdc++.h>
using namespace std;
#define int long long
int t;
int n,m;signed main()
{cin>>t;while(t--){cin>>n>>m;int a[n+5][m+5];int b[n+5][m+5];map<set<int>,int> mph;map<set<int>,int> mpl;set<int>st;mph.clear();mpl.clear();st.clear();int flag=1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>b[i][j];}}for(int i=1;i<=n;i++){st.clear();for(int j=1;j<=m;j++){st.insert(a[i][j]);}mph[st]++;}for(int i=1;i<=m;i++){st.clear();for(int j=1;j<=n;j++){st.insert(a[j][i]);}mpl[st]++;}for(int i=1;i<=n;i++){st.clear();for(int j=1;j<=m;j++){st.insert(b[i][j]);}if(mph.count(st)==0){flag=0;}}for(int i=1;i<=m;i++){st.clear();for(int j=1;j<=n;j++){st.insert(b[j][i]);}if(mpl.count(st)==0){flag=0;}}if(flag==1)cout<<"YES"<<"\n";elsecout<<"NO"<<"\n";}return 0;
} 

这篇关于Codeforces Round 950 (Div. 3)(A~E题解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031076

相关文章

Codeforces Round #240 (Div. 2) E分治算法探究1

Codeforces Round #240 (Div. 2) E  http://codeforces.com/contest/415/problem/E 2^n个数,每次操作将其分成2^q份,对于每一份内部的数进行翻转(逆序),每次操作完后输出操作后新序列的逆序对数。 图一:  划分子问题。 图二: 分而治之,=>  合并 。 图三: 回溯:

Codeforces Round #261 (Div. 2)小记

A  XX注意最后输出满足条件,我也不知道为什么写的这么长。 #define X first#define Y secondvector<pair<int , int> > a ;int can(pair<int , int> c){return -1000 <= c.X && c.X <= 1000&& -1000 <= c.Y && c.Y <= 1000 ;}int m

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

Codeforces Round #113 (Div. 2) B 判断多边形是否在凸包内

题目点击打开链接 凸多边形A, 多边形B, 判断B是否严格在A内。  注意AB有重点 。  将A,B上的点合在一起求凸包,如果凸包上的点是B的某个点,则B肯定不在A内。 或者说B上的某点在凸包的边上则也说明B不严格在A里面。 这个处理有个巧妙的方法,只需在求凸包的时候, <=  改成< 也就是说凸包一条边上的所有点都重复点都记录在凸包里面了。 另外不能去重点。 int

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

Codeforces 482B 线段树

求是否存在这样的n个数; m次操作,每次操作就是三个数 l ,r,val          a[l] & a[l+1] &......&a[r] = val 就是区间l---r上的与的值为val 。 也就是意味着区间[L , R] 每个数要执行 | val 操作  最后判断  a[l] & a[l+1] &......&a[r] 是否= val import ja

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

CSS实现DIV三角形

本文内容收集来自网络 #triangle-up {width: 0;height: 0;border-left: 50px solid transparent;border-right: 50px solid transparent;border-bottom: 100px solid red;} #triangle-down {width: 0;height: 0;bor

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述