题目大致意思是说给定n本书,每一本由一个小写字母表示,k本一组(k一定为n的因数),求每一组的MEX值,并且组合成字符串,使得所得的字符串最大。贪心,每次从a选到第min(k,25)个字母,遇到0直接输出并跳出即可,都不为零就输出下一个字母。
#include<bits/stdc++.h>
using namespace std;
void solve()
{
int n,k;
cin>>n>>k;
string s;
int a[26]={0};
cin>>s;
for(int i=0;i<s.size();i++) a[s[i]-'a']++;
for(int i=1;i<=k;i++)
{
int cnt=0;
for(int j=0;j<26;j++)
{
if(a[j]<i)
{
char kk=j+'a';
cout<<kk;
break;
}
cnt++;
if(cnt==n/k)
{
char kk=j+1+'a';
cout<<kk;
break;
}
}
}
cout<<endl;
return ;
}
int main()
{
int t;
cin>>t;
while(t--) solve();
return 0;
}
总结:题目看得太慢了,还有就是能找到结果就行,不用太去纠结过程,写得越多,越容易错,还很难找到错误在哪。
题目大致意思失是说给定三个成”L“形的三个点,每一次操作可以使得一个点跳过另外一个点到达其对称的位置,问能否到达目标位置。可以找一下规律,把能到的点和不能到的点找一下共同点。共同点就是:如果说给定点的中心点在角落位置,那么每次只能走在边缘位置,这个时候如果说横纵坐标有相同的就可以到达,否则就不能。如果说不是在边缘位置,如图所示,就只能放在黄色区域的位置,白色区域是不管怎么样都不能到的,规律就是当且仅当目标位置与中心位置的横纵坐标只差都为奇数的时候是达不到的,其他的都是可以达到的。
#include<bits/stdc++.h>
using namespace std;
int main()
{
//如果是是在角落的位置需要特判,因为那样就只能在十字上面移动
//也就是说此时,只能是目标的横坐标与中心点的横坐标相等,或者是纵坐标相等
//如果说不是在角落位置,那么如果是目标点的横纵坐标差值都为奇数的时候是不行的,其余的都是可以满足的
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int r1,c1,r2,c2,r3,c3;
cin>>r1>>c1>>r2>>c2>>r3>>c3;
//首先就是先找到中心的位置是哪个
int zhx,zhy;
int x,y;
cin>>x>>y;
if(r1==r2&&c1==c3||r1==r3&&c1==c2) zhx=r1,zhy=c1;
else if(r2==r1&&c2==c3||r2==r3&&c2==c1) zhx=r2,zhy=c2;
else if(r3==r1&&c3==c2||r3==r2&&c3==c1) zhx=r3,zhy=c3;
if((zhx==1||zhx==n)&&(zhy==1||zhy==n))//角落位置
{
if(x==zhx||y==zhy) cout<<"YES\n";
else cout<<"NO\n";
}
else
{
if(abs(x-zhx)%2&&abs(y-zhy)%2) cout<<"NO\n";
else cout<<"YES\n";
}
}
return 0;
}
总结:对于与位置相关的,可以找一下规律,切记,不要眼高手低。