Codeforces Round #754 (Div. 2)

本文详细解析了Codeforces Round #754 (Div.2)中的三道编程题目,包括A题‘A.M.Deviation’的最优解法,B题‘ReverseSort’的字符串操作策略,以及C题‘DominantCharacter’的最短匹配子串搜索。通过讨论各种情况和边界条件,给出了简洁高效的代码实现。
摘要由CSDN通过智能技术生成

Codeforces Round #754 (Div. 2)

1,A. A.M. Deviation-Codeforces Round #754 (Div. 2)

题意:a,b,c三个数。每次只能选两个数,一个数字加一,一个数字减一。可以进行任意次数的操作。
操作完的三个数是a1,b1,c1求其中两个数的和减去第三个数的两倍的绝对值的最小值。
题解:三种情况abs(a+b-2c)%3,abs(c+b-2a)%3,abs(a+c-2*b)%3,求最小值。
解释:因为如果两个任取两个数,减第三个数的两倍会发现,如果每次操作的是两个相加的数,结果不变,如果取得是一个减数一个被减数,那结果可能加三或者减三。所以最后的结果只能是最初的结果%3,才是尽可能小的。
代码:

/*wrcccccccc
*/
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
 
int main()
{
    int t;
    cin >> t;
    int i1,i3,i2,i4;
    while(t)
    {t--;
    cin >> i1>>i2>>i3;
    int max1=100;
    i4=9999999;
    i4=abs(i1+i2-2*i3);
    max1=min(max1,i4%3);
    i4=abs(i3+i2-2*i1);
    max1=min(max1,i4%3);
    i4=abs(i1+i3-2*i2);
    max1=min(max1,i4%3);
    
    cout <<max1 << endl;
    }
    return 0;
}

2,B. Reverse Sort-Codeforces Round #754 (Div. 2)

题意:有一个长度n的二进制字符串。每次可以交换两个位置p,q,但p>q。每次操作都将pq放入容器中,直到将字符串所形成的数最小。将容器排序。按照回文的顺序将原字符串进行交换,如果结果不一样就需要把容器中的元素放到另一个容器中,进行该操作。
题解:l=1,r=n。从左边找到1停止,从右边找到0停止。会发现都是偶数出现,结果是双数。
代码:

#include<iostream>
#include<string>
#include<string.h>
using namespace std;
string x,y;
int a[1010];
int n,m;
int main()
{
    int i1,i2,i3,i4,i5,l,r,num;
    int t;
    cin >> t;
    while(t--)
    {y='m';num=0;
    memset(a,0,sizeof(a));
    cin >> n;
    cin >> x;
    x=y+x;
    l=1;r=n;
    while(l<=r)
    {
    while(x[l]=='0'&&l<=r) l++;
    while(x[r]=='1'&&r>=l) r--;
    if(l>=r) break;
    {
    a[l]=1;a[r]=1;l++;r--;
    num+=2;
    }
    
    }
    if(num!=0)cout <<1 << endl;
    cout <<num<<' ';
    for(i1=1;i1<=n;i1++)
    {
   if(a[i1]==1) {cout<<i1<<' ';}
    }
    cout<< endl;
    }
    return 0;
}

3,C. Dominant Character-Codeforces Round #754 (Div. 2)

题意:给出一个字符串s,子字符串为z,如果z中a的数量大于b的数量并且也大于c的数量。那这个字符串是符合条件的。找出符合条件的最短字符串。
题解:其中情况,aa,aba,aca,abca,acba,abbaccq,accabba,按照顺序查找,找到则输出。否则-1。
解释:看的别人的代码。枚举法,因为其余情况都是子集或者是不满足情况。
代码:

#include <iostream>
#include <string>
using namespace std;
string s;
string a="aa";
string b="aba";
string c="aca";
string d="abca";
string e="acba";
string f="abbacca";
string g="accabba";
int n,m;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>s;
        m=s.find(a);if(m!=-1) {cout<<2<<endl;continue;}
        m=s.find(b);if(m!=-1) {cout<<3<<endl;continue;}
        m=s.find(c);if(m!=-1) {cout<<3<<endl;continue;}
        m=s.find(d);if(m!=-1) {cout<<4<<endl;continue;}
        m=s.find(e);if(m!=-1) {cout<<4<<endl;continue;}
        m=s.find(f);if(m!=-1) {cout<<7<<endl;continue;}
        m=s.find(g);if(m!=-1) {cout<<7<<endl;continue;}
        cout<<-1<<endl;
 
    }
    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值