Codeforces Round #829 (Div. 2)——(ABC1)题解

一、解题思路

1.A. Technical Support——1754A

题目分析:题目给定了一串字符串,字符串包含了两种字符一个为‘Q’表示问题,另一个字符'A'表示回答问题,题目要求输出是否对于每个问题,都做出了解答,若是输出YES,否则输出NO。注意:对于一个问题可以有多个回答,一个问题可以被延后回答。

思路:遍历字符串统计问题和回答是否匹配,若当前字符为‘Q’则统计次数加一,代表需要回答的问题加1,若当前字符为‘A’则统计次数减1,代表需要回答的问题被减少一个,若对于当前字符为‘Q’时,统计次数小于0,说明对于之前问题的回答,有多个,则对于当前问题没有回答,则需要重置统计次数为0,然后再计数。

2.B. Kevin and Permutation——1754B

题目分析:题目给定了一个1到n的序列,要求将该序列重新组合,使得所有连续两个数绝对值中的最小值尽可能大,并输出排好序的序列

思路:因为题目要求连续两个数中绝对值最小的尽可能大,则我们构造的序列任意两个数其绝对值要大于等于某一个值,若该值为\left \lfloor n/2 \right \rfloor,则对于1到\left \lfloor n/2 \right \rfloor,都有对应满足差值的数,若n为奇数则最后一个数n与第\left \lfloor n/2 \right \rfloor也满足该差值,所以我们可以构造一个序列令x=\left \lfloor n/2 \right \rfloor,则有

n为偶数:x,1,x+1,2,x+2,...,x+x,x

n为奇数:x,1,x+1,2,x+2,...,x+x,x,n

3.C1. Make Nonzero Sum (easy version)——1754C1

题目分析:给定一串仅包含-1或1的序列,要求将这些序列分成k块,并保证所有块的和加起来为0        

对于一块序列s_{i},其左区间为a_{li},右区间为a_{ri},该序列的和计算方法为

s_{i} = a_{li}a_{li+1}+a_{li+2}a_{li+3}+…±a_{ri}

思路:我们发现任意两个数进行运算都得到一个偶数,则若要求最后所有块的和加起来为0,序列总数n需要为偶数

当我们考虑两个数的区间,若区间内的两个数相同,则相减得0,若不同则将这两个数的区间分成两个含一个数的区间,两个区间和相加得0,通过该方法可以构造总和为0的区间块

二、代码实现

1.A. Technical Support——1754A

#include
#include
#include
#include
#include

using namespace std;

#define iforn(i,a,b)    for(int i=a;i=b;i--)
typedef long long LL;

void solve(){
    int n;
    string str;
    cin >>n >>str;
    int cnt=0;
    iforn(i,0,n){
        if(str[i]=='Q') {
            if(cnt<0)  cnt=0;
            cnt++;
        }
        else cnt--;
    }
    if(cnt<=0)  puts("YES");
    else puts("NO");
}

int main(){
    int t;
    cin >>t;
    iforn(i,0,t)    solve();
    return 0;
}

2.B. Kevin and Permutation——1754B

#include
#include
#include
#include
#include

using namespace std;

#define iforn(i,a,b)    for(int i=a;i=b;i--)
typedef long long LL;

void solve(){
    int n;
    cin >>n;
    int d=n>>1;
    iforn(i,1,d+1){
        cout <>t;
    iforn(i,0,t)    solve();
    return 0;
}

3.C1. Make Nonzero Sum (easy version)——1754C1

#include
#include
#include
#include
#include
#include

using namespace std;

#define iforn(i,a,b)    for(int i=a;i=b;i--)
typedef long long LL;
typedef pair PII;
const int N=2e5+10;
int a[N];

void solve(){
    int n;
    cin >>n;
    iforn(i,1,n+1)  scanf("%d",&a[i]);
    if(n&1) puts("-1");
    else {
        vector vt;
        for(int i=1;i<=n;i+=2){
           if(a[i]==a[i+1]) vt.push_back({i,i+1});
           else vt.push_back({i,i}),vt.push_back({i+1,i+1});
       }
       printf("%d\n",vt.size());
       for(auto i:vt)   printf("%d %d\n",i.first,i.second);
    }
}

int main(){
    int t;
    cin >>t;
    iforn(i,0,t)    solve();
    return 0;
}

 

你可能感兴趣的:(题解,算法)