A - Two Subsequences
题意:
给你一个字符串,你需要找到这个字符串第一个最小的字符,输出这个字符和删去这个字符的字符串
思路:
遍历找到第一个最小字符标记一下位置即可
代码:
#include<iostream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
string s;
cin>>s;
char minn='z';
int cnt=0;
for(int i=0;i<s.size();i++)
{
if(s[i]<minn)
{
minn=s[i];
cnt=i;
}
}
cout<<minn<<" ";
for(int i=0;i<s.size();i++)
{
if(i==cnt)
continue;
cout<<s[i];
}
cout<<endl;
}
}
B - Divine Array
题意:
给你一个数量为n的数组,每个元素可以进行一种变换,使其变成当前这个数的个数,即a[i] = cnt[a[i]] .有q次询问,问第x个数变换k次后的值。如题目中
Initial array: | 2 1 1 4 3 1 2 |
After the 1-st step: | 2 3 3 1 1 3 2 |
After the 2-nd step: | 2 3 3 2 2 3 2 |
After the 3-rd step: | 4 3 3 4 4 3 4 |
... | ... |
原始数组2 1 1 4 3 2,第一次变换后
2的个数为2,1的个数为3,1的个数为3,4的个数为1,3的个数为1,1的个数为3,2的个数为2
第一次变换后的数组为2 3 3 1 1 3 2。
思路:
用二维数组去存储初始数组a[k][i],表示第k次变换后a[i]的值。这里注意当变换次数大于等于n时,数组内的元素将不会在变化,所以循环到n结束。(1 2 3->1 1 1->3 3 3->3 3 3),用cnt数组存放变换后的值即可。
代码:
#include<iostream>
using namespace std;
int a[2005][2005]={0};
int cnt[2005]={0};
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[0][i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
cnt[j]=0;
for(int j=1;j<=n;j++)
cnt[a[i-1][j]]+=1;
for(int j=1;j<=n;j++)
a[i][j]=cnt[a[i-1][j]];
}
int q;
cin>>q;
while(q--)
{
int x,k;
cin>>x>>k;
cout<<a[min(n,k)][x]<<endl;
}
}
}
C - Array Elimination
题意:
给你n个数,你可以任意次选择其中任意k个数进行操作,求出这k个数按位与(&)的和,使这k个数减去其按位与(&)的和, 最终使n个数都为0,求有多少个这样的k?
思路:
对于每一位,设1的个数为s,那么满足条件的k一定是s的因子,因为只有这样才能完美的消掉每一个1。,然后对于整个数,我们肯定要找出每一位都能满足条件的k,才能使整个数为0。(与运算只有全1为1,其他情况为0)
可看(12条消息) Codeforces Round #751 (Div. 2) C. Array Elimination_遗落之辉的博客-CSDN博客
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int a[200005],ans[200005];
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n;
int tot = 0;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
ans[i] = 0;//不要忘了初始化ans
}
for(int i = 0; i <= 30; i++) //枚举所有位数
{
int cnt = 0;
for(int j = 1; j <= n; j++)
{
if((1 << i) & a[j])
cnt++;
}
if(cnt == 0) //如果是0的话所有数都可以
{
for(int j = 1; j <= n; j++)
ans[j]++;
}
else //不为0的话其所有因子可以
{
for(int j = 1; j <= cnt; j++)
if(cnt % j == 0)
ans[j]++;
}
}
for(int i = 1; i <= n; i++) //1是一定满足的,所以我们可以直接以1来判断
{
if(ans[i] == ans[1])
printf("%d ", i);
}
printf("\n");
}
return 0;
}