Codeforces Round #744 (Div. 3 A->E1)
A. Casimir’s String Solitaire
思路:结论题,统计判断是否B==A+C
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
string a;
cin>>a;
int cnt1=0,cnt2=0,cnt3=0;
for(int i=0;i<a.size();i++){
if(a[i]=='A')cnt1++;
else if(a[i]=='B')cnt2++;
else cnt3++;
}
if(cnt2==cnt1+cnt3)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
B.Shifting Sort
思路:因为最多不超过n次,且数据小,我们可以直接暴力扫描,将数组变成升序数组,通过从i从0到n-1每次扫描选择剩余数中最小元素的下标进行交换,本题对STL熟练的话可以很短代码实现。
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N=55;
int a[N];
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
vector<tuple<int,int,int>>res;//STL三元组的储存
for(int i=0;i<n;i++){
int j=min_element(a+i,a+n)-a;//查找数组中最小元素的下标,可以乱序
if(i==j)continue;
rotate(a+i,a+j,a+n);//将区间i~j-1与区间j~n进行交换
res.push_back({i,n,j-i});
}
cout<<res.size()<<endl;
for(auto [l,r,d]:res){//注意元组的输出形式
cout<<l+1<<' '<<r<<' '<<d<<endl;
}
}
return 0;
}
C.Ticks
思路:扫描所有带*号的点,求取其在限制范围内最大的高度,如果高度大于k,那么更新这个tick,将其转化为非’.’,最后判断是否还有’ * '存在,如果存在说明这图是不满足条件的。
参考代码
#include<bits/stdc++.h>
using namespace std;
void solve(){
int n,m,k;
cin>>n>>m>>k;
string s[n];//将所有行用s来储存
for(int i=0;i<n;i++)cin>>s[i];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='.')continue;//如果当前点是'.',不用判断,只需判断'*'的存在是否合法
int d=0;//如果当前是非'.',那么去求得尽可能最大的高度d
while(d<i&&d<j&&d+1+j<m&&s[i-d-1][j-d-1]!='.'&&s[i-d-1][j+d+1]!='.')d++;//卡在边界以内,并且左上和右上非'.',深度才会++
if(d>=k){//如果d>=k的话才进行更新,否则的话图形不满足要求,无需理会。参考第二样例的上面d为1的情况
for(int c=0;c<=d;c++){
s[i-c][j-c]='X';//将满足条件的转化为非'.'
s[i-c][j+c]='X';
}
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(s[i][j]=='*'){//最后判断是否还存在'*'
cout<<"NO"<<endl;
return ;
}
}
}
cout<<"YES"<<endl;
}
int main(){
int T;
cin>>T;
while(T--){
solve();
}
return 0;
}
D.Productive Meeting
思路:利用大根堆的性质,每次拉出两个当前局最大的两个数进行匹配,直至堆内元素<=1结束匹配
参考代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
void solve(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)cin>>a[i];
priority_queue<PII>queue;//大根堆
for(int i=0;i<n;i++){
if(a[i]>0){
queue.push({a[i],i});//存储元素个数和下标
}
}
vector<PII>S;
while(queue.size()>1){
auto x1=queue.top();//拉出当前局最大的两个数
queue.pop();
auto x2=queue.top();
queue.pop();
S.push_back({x1.second,x2.second});
if(x1.first>1)queue.push({x1.first-1,x1.second});//如果>1说明还能操作至少一次
if(x2.first>1)queue.push({x2.first-1,x2.second});
}
cout<<S.size()<<endl;
for(auto x:S){
cout<<x.first+1<<' '<<x.second+1<<endl//因为开始是从0开始读入,所以最后要+1
}
}
int main(){
int T;
cin>>T;
while(T--){
solve();
}
return 0;
}
E1.Permutation Minimization by Deque
思路:懂得运用STL的deque就是一个模拟,非常简单。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
deque<int>S;
int n;
cin>>n;
for(int i=0;i<n;i++){
int f;
cin>>f;
if(i==0)S.push_back(f);//如果没有元素直接放
else{
if(f<S.front())S.push_front(f);//如果当前数小于队头那么根据贪心直接丢队头
else S.push_back(f);//否则的话尽可能丢队尾(因为只能操作队头和队尾)
}
}
while(!S.empty()){//从队头一直输出就是最后所求
cout<<S.front()<<' ';
S.pop_front();
}
cout<<endl;
}
return 0;
}