Codeforces Round #624 (Div. 3)题解全集

大家好,我是lcj 没错 我又来骗访客量了 hhhhh
每次div3都挺欢乐的
A 添加链接描述
题意 输入n m 每次n的操作可以是n+任意奇数 或者n-任意偶数
问你最少操作多少次使得n=m
题解 先判断n m基偶性 以及大小 最多两次 很明显


int main(){
ll t=read();
while(t--){
ll n=read();
ll m=read();
if(n==m){
  printf("0\n");
  continue;  
}
if((m>n&&(m-n)%2==1)||(m<n&&(n-m)%2==0)){
    printf("1\n");
    continue;
}
printf("2\n");
}
return 0;
}

B题 添加链接描述
题意 输入n m代表a p数组长度 然后输入a p数组元素
规则如下 a[pi] and a[pi+1] 可以互换 前提没越界 可以操作无限次 问你最终a数组能不能从左往右一直不递减
思路 :冒泡法嘛 因为也就最多100个数 我们可以跑999次 对a数组的交换 然后输出的时候判断下ai ai+1的大小即可 很直观暴力

 #include<bits/stdc++.h>
 #define ll long long
 #define mod 100006
 #define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    char c=getchar();
    ll f=1,x=0;
    while(c<'0'||c>'9'){
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^'0');
        c=getchar();
    }
    return x*f;
}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}//最大公因数
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/
const int manx=109;
ll a[manx],b[manx],vis[manx];
int main()
{
  ll p=read();
  while(p--){
   memset(vis,0,sizeof(vis));
   ll n=read(),m=read();
   for(int i=1;i<=n;i++) a[i]=read();
   for(int i=1;i<=m;i++) b[i]=read(),vis[b[i]]=1;
   ll num=1;
   while(num){
    num=0;
    for(int i=1;i<=n;i++)
     if(vis[i]){
      if(a[i]>a[i+1])
       num=1,swap(a[i],a[i+1]);
     }
   }
   int ans=0;
   for(int i=1;i<n;i++){
    if(a[i]>a[i+1])
     ans=1;
   }
   if(ans) printf("NO\n");
   else printf("YES\n");
  }
  return 0;
}

C 添加链接描述
前缀和的运用
题意 给出一个字符串,再给出m个子串,求子串和原串个字母出现的次数
题解:前缀和

int dp[200010][30],cnt[30];
char s[200010];
int main()
{
    int t,n,m;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        scanf("%s",s+1);
        for(int i=1; i<=n; i++)
        {
            for(int j=0; j<26; j++)
                dp[i][j]=0;
        }
        for(int i=1; i<=n; i++)
        {
            dp[i][s[i]-'a']++;
            for(int j=0; j<26; j++)
            {
                dp[i][j]+=dp[i-1][j];//前缀和数组
            }
        }
        for(int i=0; i<26; i++)
        {
            cnt[i]=dp[n][i];//二维压缩成最后的一维
        }
        while(m--)
        {
            int pos;
            cin>>pos;
            for(int i=0; i<26; i++)
            {
                cnt[i]+=dp[pos][i];                                            
            }
        }
        for(int i=0; i<25; i++)
        {
            cout<<cnt[i]<<" ";
        }
        cout<<cnt[25]<<endl;
    }
    return 0;
}
 

D 添加链接描述
输入t组数据 输入a b c 问b%a=0 c%b=0 全体最小的变化量是多少 以及输出满足条件的a1 b1 c1
题解:三重循环 枚举 i=1 i++
j=i j=j+i
k=j k=k+j 循环上限我只开了1w 被hack了 可惜了

//
 #include<bits/stdc++.h>
 #define ll long long
 #define mod 100006
 #define IOS ios::sync_with_stdio(false);cin.tie(0)
 using namespace std;
inline ll read(){
    char c=getchar();
    ll f=1,x=0;
    while(c<'0'||c>'9'){
        if(c=='-')
            f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        x=(x<<1)+(x<<3)+(c^'0');
        c=getchar();
    }
    return x*f;
}
ll gcd(ll a,ll b){ return b==0?a:gcd(b,a%b);}//最大公因数
/*最小公倍数lcm(a,b)=a*b/gcd(a,b);
gcd(ka,kb)=k*gcd(a,b);
gcd(s/a,s/b)=s/gcd(a,b);
gcd(x^a-1,x^b-1)=x^gcd(a,b)-1;
gcd(f[a],f[b])=f[gcd(a,b)];
lcm(ka,kb)=k*lcm(a,b);
lcm(f[a],f[b])=f[lcm(a.b)];*/
int main()
{
    ll t=read();
    while(t--){
   ll a,b,c;
   ll e,r,t;
   a=read();
   b=read();
   c=read();
   ll add=9999999;
  for(int i=1;i<=20000;i++){
  for(int j=i;j<=20000;j=j+i){
    for(int k=j;k<=20000;k=k+j){
    ll x,y,z;
    x=abs(a-i);
    y=abs(b-j);
    z=abs(c-k);
    add=min(add,x+y+z);
    if(add==x+y+z){
        e=i;r=j;t=k;
    }
    }
  }
  }
printf("%lld\n",add);
printf("%lld %lld %lld\n",e,r,t);
    }
return 0;
}

E 构造二叉树 - - 没A掉 赛后补题的
给出 n个节点深度和为 d 问你是否可以构成一个二叉树,可以的话输出全部节点深度。
全部节点组成一条链的话深度和肯定最大,我们就先组成一条链,然后每次移动最下面那个节点,看看移动到哪里合适,然后判断是否可以组成深度和为 d。

F 题意 输入n 代表n个元素 输入x 代表初始位置 v代表初始速度嘛 匀速运动 注意方向 求i j之间距离和的最小值 那么也就两种情况 树状数组维护一下+离散化
一种是永远追不上的 相对最小距离就是初始距离 另一种就是肯定会相遇的 距离最小为0

//https://paste.ubuntu.com/p/n4DT66cQQk/
崩了 见谅 QAQ

继续加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值