一、解题思路
1.A. Technical Support——1754A
题目分析:题目给定了一串字符串,字符串包含了两种字符一个为‘Q’表示问题,另一个字符'A'表示回答问题,题目要求输出是否对于每个问题,都做出了解答,若是输出YES,否则输出NO。注意:对于一个问题可以有多个回答,一个问题可以被延后回答。
思路:遍历字符串统计问题和回答是否匹配,若当前字符为‘Q’则统计次数加一,代表需要回答的问题加1,若当前字符为‘A’则统计次数减1,代表需要回答的问题被减少一个,若对于当前字符为‘Q’时,统计次数小于0,说明对于之前问题的回答,有多个,则对于当前问题没有回答,则需要重置统计次数为0,然后再计数。
2.B. Kevin and Permutation——1754B
题目分析:题目给定了一个1到n的序列,要求将该序列重新组合,使得所有连续两个数绝对值中的最小值尽可能大,并输出排好序的序列
思路:因为题目要求连续两个数中绝对值最小的尽可能大,则我们构造的序列任意两个数其绝对值要大于等于某一个值,若该值为,则对于1到,都有对应满足差值的数,若n为奇数则最后一个数n与第也满足该差值,所以我们可以构造一个序列令x=,则有
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
对于一块序列,其左区间为,右区间为,该序列的和计算方法为
= −+−+…±
思路:我们发现任意两个数进行运算都得到一个偶数,则若要求最后所有块的和加起来为0,序列总数n需要为偶数
当我们考虑两个数的区间,若区间内的两个数相同,则相减得0,若不同则将这两个数的区间分成两个含一个数的区间,两个区间和相加得0,通过该方法可以构造总和为0的区间块
二、代码实现
1.A. Technical Support——1754A
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>using namespace std;#define iforn(i,a,b) for(int i=a;i<b;i++)
#define dforn(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<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>using namespace std;#define iforn(i,a,b) for(int i=a;i<b;i++)
#define dforn(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 <<i+d <<" " <<i <<" " <<endl;}if(n&1) cout <<n; cout <<endl;
}int main(){int t;cin >>t;iforn(i,0,t) solve();return 0;
}
3.C1. Make Nonzero Sum (easy version)——1754C1
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>
#include<vector>using namespace std;#define iforn(i,a,b) for(int i=a;i<b;i++)
#define dforn(i,a,b) for(int i=a;i>=b;i--)
typedef long long LL;
typedef pair<int,int> 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<PII> 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;
}