A. Technical Support
题目链接:
题面:
题意:
有一段对话,Q是询问,A是回答,对于每个问题,你可以回答一句或者多句,你也可以后面回答前面的问题,问这个对话框是否每个问题都有回答
思路:
对于每次回答,我们优先假设是没有回答过的询问的回答,然后判断是否每个问题都有回答即可
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int n;
string s;
cin >> n >> s;
int ans = 0, cnt = 0;
for(int i = 0; i < n; i++){
if(s[i] == 'Q'){
ans++;
}else{
if(ans > 0){
ans--;
}
}
}
if(ans == 0){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
}
return 0;
}
B. Kevin and Permutation
题目链接:
题面:
题意:
有一个长度为n的数列,由1-n构成,问如何构造这个数列,使两两之间的差值的绝对值的最小值最大
思路:
长度为n的数列,两两之间的差值的绝对值的最小值的最大情况为n/2
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int n;
cin >> n;
int ans = n / 2;
bool f = 0;
for(int i = 1; i <= ans; i++){
if(f){
cout << " ";
}
f = 1;
cout << i + ans << " " << i;
}
if(n & 1){
if(f){
cout << " ";
}
cout << n;
}
cout << endl;
}
return 0;
}
C1. Make Nonzero Sum (easy version)
题目链接:
题面:
题意:
有一个长度为n的数列,你可以把它分成很多段,每个段的价值为奇数位加上偶数位的相反数的和,分成多段后每段的价值和是否能为0
思路:
当前位和后一位相同的时候,把这两个放一起就能为0,如果相反的情况,那么分开放和也为0,那么两两配对即可,所以如果n是奇数,一定不可能,偶数就判断能否放一起即可
代码:
#include<bits/stdc++.h>
using namespace std;
int arr[200005];
vector<pair<int, int>> ve;
int main(){
int t;
cin >> t;
while(t--){
ve.clear();
int n;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> arr[i];
}
if(n & 1){
cout << -1 << endl;
continue;
}
for(int i = 1; i <= n; i++){
if(arr[i] - arr[i + 1] == 0){
ve.push_back({i, i + 1});
}else{
ve.push_back({i, i});
ve.push_back({i + 1, i + 1});
}
i++;
}
cout << ve.size() << endl;
for(int i = 0; i < ve.size(); i++){
cout << ve[i].first << " " << ve[i].second << endl;
}
}
return 0;
}
D. Factorial Divisibility
题目链接:
题面:
题意:
有一个长度为n的数组,问这个数组每个数的阶乘和是不是x阶乘的倍数
思路:
对于ai >= x的情况,这个一定是x的倍数
ai<x的情况,我们需要记录每个数出现的个数
然后尽量的把i!的阶乘变成(i + 1)!,如果i出现的个数是(i+1),那么就可以把i的个数减(i+1),i+1的个数++,看能不能把小于x的数,全转化为x即可
代码:
#include<bits/stdc++.h>
using namespace std;
int num[500005];
int main(){
int n, x;
cin >> n >> x;
int a;
for(int i = 0; i < n; i++){
cin >> a;
if(a < x){
num[a]++;
}
}
for(int i = 1; i < x; i++){
if(num[i] > i){
num[i + 1] += num[i] / (i + 1);
num[i] = num[i] % (i + 1);
}
}
bool f = 0;
for(int i = 1; i < x; i++){
if(num[i] != 0){
f = 1;
break;
}
}
if(!f){
cout << "Yes" << endl;
}else{
cout << "No" << endl;
}
return 0;
}