Codeforces Round #650 (Div. 3) A-F1题解

A. Short Substrings 题目链接

题意: Bob提出了字符串a=“abac”,那么字符串a中所有长度为2的子字符串都是:“ab”, “ba”, “ac”。因此,字符串b=“abbaac”。给你一个字符串b,求a。

题解: a[0]=b[0],a[1]=b[1],然后以2为长度,使a[j++]=b[i+1],即每次得到b数组后2长度的最后一个字符。

#include<bits/stdc++.h>
#define ll long long
#define maxn 2010
#define frj(i,n,k) for(long long i=2;i<=n-k;i++)
#define mc(i,q,k) modC(i,q,k)
using namespace std;
ll n,k,t,m,x,i,sum,l,r;
char a[105],b[105];
int main()
{
     cin>>t;
     while(t--){
           cin>>b;
           n=strlen(b);
           if(n==2) cout<<b<<endl;
     else {
       a[0]=b[0];a[1]=b[1];
       ll j=2;
           for(i=2;i<n-1;i+=2){
           a[j++]=b[i+1];
     } 
     for(i=0;i<j;i++)
     cout<<a[i];
     cout<<endl;
   } 
   }
 return 0;
}
 

B. Even Array 题目链接

题意: 给定一个长度为N的数组,数组下标从0开始,为了使数组元素奇偶性与下标奇偶性相同,请给出数组元素移动的次数。
题解: 判断数组元素奇数偶数个数并记录,相等则可以交换得到符合条件的数组,否则输出-1.

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
#include <cmath>
#define ll long long
#define PI 3.141592653589
using namespace std;
ll n,i,j,m1,m2,x,ii,jj;
ll a[45];
int main()
{
 int t;
 cin>>t;
    while(t--){
     cin>>n;
     m2=0;m1=0;
     for(i=0;i<n;i++){ 
          cin>>a[i];
          if(i%2==0&&a[i]%2==1) m1++;
          else if(i%2==1&&a[i]%2==0) m2++;
 }
      if(m1==m2) cout<<m1<<endl;
      else cout<<"-1"<<endl;
 } 
 return 0;
}

C. Social Distance 题目链接

题意: 一个长度为N且为01的字符串,1代表有人占位,反之亦然,人与人之间最少间隔K个单位,求改变0为1且满足规则的最大改变次数。
题解: 记录0和1的个数,判断相距k+1时是否满足条件,满足则sum++,特判i=n-1时得情况。

#include<bits/stdc++.h>
using namespace std;
typedef long long int lli;
 int main()
 {
     int t;
     cin>>t;
     while(t--)
     {
         int n,k;
         cin>>n>>k;
         string s;
         cin>>s;
         int sum=0,count1=0,count0=0;
         for(int i=0;i<n;i++)
         {
              if(s[i]=='1')
              {
                  count1++;
             if(count1==1)
                  sum+=(count0)/(k+1);
              else
              {
                  sum+=(count0-k)/(k+1);
                  count1=1;
              }
              
              count0=0;
              }
              if(s[i]=='0')
                  count0++; 
              if(i==n-1&&s[i]=='0'&&count1!=0)
              {   
                  sum+=(count0)/(k+1);
              }
         }
         if(count1==0)
             sum+=(count0+k)/(k+1);
         cout<<sum<<endl;
     }
     return 0;
 }

D. Task On The Board 题目链接

题意: 给定一个字符串,一个整数数组,列如t=“abzb”,由于t1=‘a’,所有其他索引都包含字母表中后面的字母,即b1=|1-2|+|1-3|+|1-4|=1+2+3=6;因为t2=‘b’,所以只有索引j=3包含字母表中后面的字母,即b2=|2-3|=1;由于t3=‘z’,则没有指标j使得tj>ti,则b3=0;因为t4=‘b’,所以只有索引j=3包含字母表后面的字母,即:b4=|4-3|=1。因此,t = “abzb”,则b=[6,1,0,1]。 以此构造一个t数组的子数组来满足b[]的条件。
题解: 上代码吧。。

#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int maxn = 2e6+9;
using namespace std;
char s[70],dict[70];
int a[70], idx[70], cnt[70];
int table[30];
void ini(){
    memset(table, 0, sizeof(table));
    for(int i = 0; s[i]; ++i)
        ++table[ s[i] - 'a' ];
}
int main(){
    int t, n;
    cin >> t;
    while(t--){
        cin>>s;
        ini();
        cin>>n;
        memset(cnt, 0, sizeof(cnt));
        for(int i = 0; i< n; ++i){
            cin>>a[i];
            idx[i] = -1;
            cnt[i] = 0;
        }
        int round = 0;
        int remain = n;
        while(remain > 0){
            ++round;
            for(int i = 0; i < n; ++i){
                if(idx[i] == -1 && a[i] == 0){
                    idx[i] = round;
                    --remain;
                }
            }
            for(int i = 0; i < n; ++i)
                if(idx[i] == round){
                    for(int j = 0; j < n; ++j)
                        if(idx[j] == -1)
                            a[j] -= abs(i-j);
                }
        }
        for(int i = 0; i < n; ++i)
            ++cnt[ idx[i] ];
        int ptr = 1;
        for(int i = 0; i < 26 && ptr <= round; ++i){
            if( table[25 - i] >= cnt[ptr])
                dict[ptr++] = 'a' + 25 - i;
        }
        for(int i = 0; i < n; ++i)
            cout<<dict[ idx[i] ];
        cout<<endl;
    }
    return 0;
}

E. Necklace Assembly 题目链接

题意: 给定一个长度为N的字符串,判断其能否组成K个珠顺时针旋转不变的项链,输出能组成这个K的最大字符长度。
题解: 记录字符,判断是否满足条件,求max值。

#include<bits/stdc++.h>
using namespace std;
#define con continue
#define bk break
#define ms(a, b) memset((a), (b), sizeof(a))
#define mp make_pair
#define sz size()
#define len(X) strlen(X)
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define de cout<<"test"<<endl;
#define st system("pause");
#define pt cout<<endl;
int main() 
{
    int a;
    while(cin>>a){
      for(int i=0;i<a;i++){
        int n,k;
        cin>>n>>k;
        string s;
        cin>>s;
        int cnt[26]={};
            int ans=0;
        for(int j=0;j<n;j++){
            cnt[s[j]-'a']++;
        }
        int tmp[2005]={};
        for(int j=1;j<=n;j++){
            int g=__gcd(j,k);
            int minr=1000000;
            int num=j/g;
            int maxr=0;
            for(int r=0;r<26;r++)
                  maxr+=cnt[r]/num;
            if(maxr*num>=j)
                  ans=max(ans,j);   
        }
        cout<<ans<<endl;
    }
}
 return 0;
}

F1. Flying Sort (Easy Version) 题目链接

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define ld double 
#define  pb push_back
#define  ff(n) for(i=0; i<n; i++)
#define mo 1000000007
ll max(ll a,ll b){return (a>b)?a:b;}
ll min(ll a,ll b){return (a<b)?a:b;}
ll mm(vector<ll>a,vector<ll>b)
{
    if(a[1]<b[1])
     return true;
     if(a[1]==b[1] && a[0]<b[0])
      return true;
      return false;
}
ll gcd(ll a,ll b)
{
    while(1)
    {
        if(a==0)
         return b;
        b%=a;
        if(b==0)
         return a;
         a%=b; 
 
    }
}
ll p2(ll k,ll n)
{
    ll re=1;
    while(n)
    {
        if(n%2==1)
         re=(re*k)%mo;
        k*=k;
        k%=mo;
        n/=2; 
    }
  return re;
}
int main() {
    ll n,m,i,j,t,k;
    t=1;
   cin>>t;
    for(ll ii=0; ii<t; ii++)
    {
        cin>>n;
        vector<ll>a(n),b(n);
        for(i=0;i<n;i++)
         {
             cin>>a[i];
             b[i]=a[i];
         }
         sort(b.begin(),b.end());
         m=0;
         k=0;
         for(i=0;i<n;i++)
         {
             ll l=i;
             k=0;
             for(j=0;j<n;j++)
             {
                 if(l==n)
                  break;
                 if(a[j]==b[l])
                   {
                       k++;
                       l++;
                   } 
             }
              m=max(m,k);
         }
         cout<<n-m<<endl;
    }
      return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值