Codeforces Round #744 (Div. 3)
A - Casimir’s String Solitaire
题意:
给定一个由A、B、C三种字符组成的字符串,按照两种方法对其进行删减,一种是删除任意位置的一个A和一个B,另外一种是删除一个B和一个C。
问能否将字符串的字符全部删除,能输出YES,不能输出NO。
分析:
思维题。记录该字符串的A、B、C的数量,若A+C==B,则能够全部删除。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<deque>
#include<queue>
#include<vector>
#include<tuple>
using namespace std;
int t;
int a,b,c;
string s;
int main(){
ios::sync_with_stdio(false);
cin>>t;
while(t--){
a=0,b=0,c=0;
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='A') a++;
else if(s[i]=='B') b++;
else if(s[i]=='C') c++;
}
if(a+c==b) printf("YES\n");
else printf("NO\n");
}
return 0;
}
B - Shifting Sort
题意:
题意:给定一个无序数组,选择一个区间l~r,对该区间的进行左旋转d个位置,将数组变为升序排列,输出每一次旋转操作时的l、r、d。
eg 左旋转2个位置: 1 2 3 4 变为==> 3 4 1 2
操作次数不限,只要可以数组变为升序即可。
分析:
2<=n<=50 数据规模较小,考虑暴力。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<deque>
#include<queue>
#include<vector>
#include<tuple>
using namespace std;
struct ST{
int l;
int r;
int d;
};
int main(){
cin>>t;
while(t--){
cin>>n;
int a[n],b[n];
for(int i=0;i<n;i++){
cin>>a[i];
b[i]=a[i];
}
sort(a,a+n);
//out(a,n);
int cnt=0;
ST ans[100];
for(int i=0;i<n;i++){
int j=i;
while(a[i]!=b[j]&&j<n)j++;
if(i!=j){
rotate(b+i,b+j,b+j+1);
//out(b,n);
ans[cnt].d=j-i;
ans[cnt].l=i+1;
ans[cnt].r=j+1;
cnt++;
}
}
cout<<cnt<<endl;
for (int i=0;i<cnt;i++) {
cout <<ans[i].l<<" "<<ans[i].r<<" "<<ans[i].d<<endl;
}
}
return 0;
}
PS:rotate的用法:
rotate(a+l,a+d,a+r)
表示区间 [l,r) ,左闭右开,
d表示偏移量(向左旋转多少个位置)
即:表示调换一个序列中子序列[left, middle)与[middle ,right)的位置
E - Permutation Minimization by Deque
题意:
题意:给一个n个数的排列,一个空的双队列,依次把排列里的数加到队列的头部或者尾部。
输出操作后字典序最小的排列。
分析:
创建一个双端队列deque,依次插入排列的数值,队列为空时直接插入;不为空,与队头元素做比较,若小于等于队头元素,则将该数插入队头,否则插入尾部。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<deque>
#include<queue>
#include<vector>
#include<tuple>
using namespace std;
int t;
deque<int> dq;
int a[200005];
int main(){
ios::sync_with_stdio(false);
cin>>t;
while(t--){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
if(dq.empty()){
dq.push_front(a[i]);
}
else{
//int endq=dq.end();
int frontq=dq.front();
if(a[i]<=frontq) dq.push_front(a[i]);
else dq.push_back(a[i]);
}
}
cout<<dq.front();
dq.pop_front();
while (!dq.empty()){
cout<<" "<<dq.front();
dq.pop_front();
}
cout<<endl;
}
return 0;
}