HRBU_20211029训练
A - Two Subsequences
题意
给出一组序列,要求分成两组序列,第一组是字符串中最小的字母,而剩余的字母是第二个序列
思路
遍历所有的字母求出最小的字母,其他的字符输出在另一个子序列中。
代码
#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
string str;
cin>>str;
int pos=0;
for(int i=0;i<str.size();i++)
{
if(str[i]<str[pos])pos=i;
}
cout<<str[pos]<<" ";
for(int i=0;i<str.size();i++)
{
if(i!=pos)
cout<<str[i];
}
cout<<endl;
}
}
B - Divine Array
题意
这题我觉得是挺有意思的一题,首先给出一个数列,该数列有无限次操作,按照规律求出每一个数字a在数列中出现的次数;例如:
数组的初始:2 1 1 4 3 1 2
经过第一次操作后变成了:2 3 3 1 1 3 2;(为什么是这样呢?你可以发现2出现了2次,所以2的下面写2,1出现了3次,所以三个1的下一次操作都是3,以此类推)
经过第二次操作:2 3 3 2 2 3 2
经过第三次操作:4 3 3 4 4 3 4
思路
暴力模拟,存在数组中所有的数字,而输出只要查找即可。
代码
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int a[2005][2005],b[2005];
int main()
{
int t;
cin>>t;
while(t--)
{
int n,q,x,k;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[0][i];
}
for(int i=0;i<n;i++)
{
memset(b,0,sizeof(b));
for(int j=0;j<n;j++)
b[a[i][j]]++;
for(int j=0;j<n;j++)
a[i+1][j]=b[a[i][j]];
}
cin>>q;
while(q--)
{
cin>>x>>k;
if(k>n)k=n;
cout<<a[k][x-1]<<endl;
}
}
}
C - Array Elimination
题意
现在给出一个长度为n的数组a,可以每次选择一个长度为b的子序列c,求出这个c子序列的位与和,然后让c中的每个元素都减去这个位与和,操作的次数为无限次,把数组a的中的所有数字变成零。
思路
这个题我看了很久都没怎么看懂,以下是参考大佬的代码。
没有找到大佬的博客,就将就着看。
代码
#include<cstdio>
#include<algorithm>
using namespace std;
int t,n,a[200001],j,ans,cnt,i;
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=1;i<=n;i++)scanf("%d",&a[i]);
ans=0;
for(i=0;i<=30;i++){
cnt=0;
for(j=1;j<=n;j++)cnt+=a[j]>>i&1;
ans=__gcd(ans,cnt);
}
for(i=1;i<=n;i++)if(ans%i==0)printf("%d ",i);puts("");
}
}
总结
其实我最近就挺烦的,不知道怎么了,感觉不怎么好,要赶快调整好!