题目分析:题目给定了一串字符串,字符串包含了两种字符一个为‘Q’表示问题,另一个字符'A'表示回答问题,题目要求输出是否对于每个问题,都做出了解答,若是输出YES,否则输出NO。注意:对于一个问题可以有多个回答,一个问题可以被延后回答。
思路:遍历字符串统计问题和回答是否匹配,若当前字符为‘Q’则统计次数加一,代表需要回答的问题加1,若当前字符为‘A’则统计次数减1,代表需要回答的问题被减少一个,若对于当前字符为‘Q’时,统计次数小于0,说明对于之前问题的回答,有多个,则对于当前问题没有回答,则需要重置统计次数为0,然后再计数。
题目分析:题目给定了一个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
题目分析:给定一串仅包含-1或1的序列,要求将这些序列分成k块,并保证所有块的和加起来为0
对于一块序列,其左区间为,右区间为,该序列的和计算方法为
= −+−+…±
思路:我们发现任意两个数进行运算都得到一个偶数,则若要求最后所有块的和加起来为0,序列总数n需要为偶数
当我们考虑两个数的区间,若区间内的两个数相同,则相减得0,若不同则将这两个数的区间分成两个含一个数的区间,两个区间和相加得0,通过该方法可以构造总和为0的区间块
#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;
}
#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;
}
#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;
}