本文主要是介绍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题解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!