Codeforces Round #744 (Div. 3 )

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值