这场比赛我自己打的是真的垃圾,也是侥幸被拿下了,第三题当时没想清楚,要不然还能止损一下,惜败惜败
话不多说,现在来看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";
else
cout<<"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";
else
cout<<"NO"<<"\n";
}
return 0;
}