CodeForces - 1367
A - Short Substrings
很显然 前两个字母都取 之后隔一个取一个
char s[maxn],ans[maxn];
int t;
int main()
{
scanf("%d",&t);
while(t--)
{
int m=0;
scanf("%s",s);
ans[m++]=s[0];ans[m++]=s[1];
for (int i=3;i<strlen(s);i+=2)ans[m++]=s[i];
repp(i,0,m)printf("%c",ans[i]);puts("");
}
return 0;
}
B - Even Array
判断两种不同类型的非法情况是否相等
int t,n,x;
int main()
{
scanf("%d",&t);
while(t--)
{
int ji=0,ou=0;
scanf("%d",&n);
rep(i,0,n-1)
{
scanf("%d",&x);
if (i%2==x%2)continue;
if (x%2==1)ji++;
if (x%2==0)ou++;
}
if (ji==ou)W(ji);
else W(-1);
}
return 0;
}
C - Social Distance
暴力预处理后再计算答案
int t,n,k;
char s[maxn];
bool ok[maxn];
int solve(int x)
{
if (x%(k+1)==0)return x/(k+1);
else return x/(k+1)+1;
}
int main()
{
scanf("%d",&t);
while(t--)
{
mem(ok,true);
scanf("%d%d",&n,&k);
scanf("%s",s);
int sz=strlen(s);
repp(i,0,sz){
if (s[i]=='1'){
rep(j,max(i-k,0),min(i+k,sz-1))ok[j]=false;}}
int num=0,ans=0;
repp(i,0,sz)
{
if (ok[i])num++;
else
{
ans+=solve(num);
num=0;
}
}
ans+=solve(num);
W(ans);
}
return 0;
}
D - Task On The Board
b[i]=0的位置肯定填当前剩余字母中最大的
如果这个最大字母不够数量,就置为0,向下直到找到一个符合的字母。
每次找到合适字母填上之后,要对其余的b[i]减去距离
比Second大的有且只有First,所以每次去掉距离后,填Second的位置的b[]必被减为0
重复操作
int t,m,b[maxn],num[maxn],sz;
char s[maxn],ans[maxn];
bool vis[maxn];
vector<int> V;
bool check()
{
rep(i,1,m)if (ans[i]=='#')return false;
return true;
}
int main()
{
scanf("%d",&t);
while(t--)
{
mem(num,0);mem(vis,false);
scanf("%s",s);
sz=strlen(s);
repp(i,0,sz)num[s[i]-'a']++;
scanf("%d",&m);
rep(i,1,m)ans[i]='#',scanf("%d",&b[i]);
while(!check())
{
V.clear();
rep(i,1,m)
{
if (vis[i]||b[i])continue;
V.pb(i);
vis[i]=true;
}
for (int i=25;i>=0;i--)
{
if (num[i]>=V.size())
{
num[i]=0;
repp(j,0,V.size())ans[V[j]]='a'+i;
break;
}
num[i]=0;
}
repp(i,0,V.size())rep(j,1,m)if (!vis[j])b[j]-=abs(V[i]-j);
}
rep(i,1,m)printf("%c",ans[i]);puts("");
}
return 0;
}
E - Necklace Assembly
假设取的长度为i
gcd(i,k)即为循环元的长度
i/(gcd(i,k))即为循环元的个数
假设字母'a'参与循环元的组成,则a的个数x与循环元中a的个数y的关系是:y=x/(i/(gcd(i,k)))
对每个字母都进行遍历,如果最终能组成循环元的最大长度大于gcd(i,k),则符合条件
int t,n,k,num[30];
char s[maxn];
int main()
{
scanf("%d",&t);
while(t--)
{
int ans=0;
mem(num,0);
scanf("%d%d",&n,&k);
scanf("%s",s);
repp(i,0,strlen(s))num[s[i]-'a']++;
rep(i,1,n)
{
int T=__gcd(i,k);
int Blocksize=i/T;
int cnt=0;
rep(j,0,25)cnt+=num[j]/Blocksize;
if (cnt>=T)ans=max(ans,i);
}
W(ans);
}
return 0;
}