首页 > 其他分享 >left 3 Codeforces Round 913 (Div. 3)

left 3 Codeforces Round 913 (Div. 3)

时间:2024-02-04 18:12:44浏览次数:30  
标签:10 int Codeforces long while solve Div 913 left

题目链接

A.

把同行同列除了起点都输出即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    char c;int a;cin>>c>>a;
    for(int i=1;i<=8;i++){
        if(i==a)continue;
        cout<<c<<i<<'\n';
    }
    for(int i=0;i<8;i++){
        if((char)('a'+i)==c)continue;
        cout<<(char)('a'+i)<<a<<'\n';
    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

B.

把大小写字母分开存储,同时记录输入顺序id
处理完后按输入顺序输出

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    string s;cin>>s;
    vector<pair<int,char>>sm,bi;
    for(int i=0;i<s.size();i++){
        if(s[i]=='b'){
            if(sm.size())sm.pop_back();
        }else if(s[i]=='B'){
            if(bi.size())bi.pop_back();
        }else if(s[i]>='a'&&s[i]<='z')sm.push_back({i,s[i]});
        else bi.push_back({i,s[i]});
    }
    for(auto tmp:sm){
        bi.push_back(tmp);
    }
    sort(bi.begin(),bi.end());
    for(auto tmp:bi){
        cout<<tmp.second;
    }
    cout<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

C.

其实可以简单地看成两部分,因为颜色越多会更优
我们就考虑两种颜色,若最多数量的颜色小等于一半,说明一定可以和其他颜色配对
注意奇偶数,只能偶数个消

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    int n;cin>>n;
    string s;cin>>s;
    vector<pair<int,int>>a(26);
    for(int i=0;i<26;i++)a[i].second=i;
    for(int i=0;i<s.size();i++){
        a[s[i]-'a'].first++;
    }
    sort(a.begin(),a.end(),greater<pair<int,int>>());
    int ma_cnt=a[0].first;
    int sum=0;
    for(int i=0;i<26;i++)sum+=a[i].first;
    if(ma_cnt<=sum/2){
        if(sum%2==0){
            cout<<0<<'\n';return ;
        }else {
            cout<<1<<'\n';return ;
        }
    }else cout<<sum-2*(sum-ma_cnt)<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

D.

二分
先算出现在所能跳的最左边和最右边的值
判能否跳到第i条线段
然后更新到第i条线段的范围

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    int n;cin>>n;
    vector<pair<int,int>>v(n+1);
    for(int i=1;i<=n;i++)cin>>v[i].first>>v[i].second;
    int l=0,r=1e9,mid;
    int ans=1e9;
    while(l<=r){
        mid=(l+r)/2;
        int tl=0,tr=0;
        bool f=0;
        for(int i=1;i<=n;i++){
            tl-=mid;tr+=mid;
            if(tl<=v[i].second&&tr>=v[i].first){
                tl=max(tl,v[i].first);tr=min(tr,v[i].second);
            }else{
                f=1;
                break;
            }
        }
        if(f)l=mid+1;
        else {
            r=mid-1;
            ans=min(ans,mid);
        }
    }
    cout<<ans<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

E.

举个例子:
9+0+1=10
9+0+1 != 1+0
所以每个数位不能产生进位
那么每个数位就是独立的
枚举每个数位3个数能取哪些值,再全部乘起来

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

int get(int x){
    int ans=0;
    for(int i=0;i<=x;i++){
        for(int j=0;j<=x;j++){
            for(int k=0;i+j+k<=x;k++){
                if(i+j+k==x) {
                    ans++;
                    // cout<<i<<' '<<j <<' '<<k<<'\n';
                }
            }
        }
    }
    return ans;
}
void solve() {
    int n;cin>>n;
    int ans=1;
    while(n){
        ans*=get(n%10);
        n/=10;
    }
    cout<<ans<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

F.

要求不降序排列,那么只有一种排列情况
必须要处理直到特定排列顺序
而翻转时机不会影响最优解
往前放也不会改变数字的相对顺序
所以要求本来就是非降序排列,只是起点未知
所以两种情况:
1.直接往前放
2.先翻转,再往前放
把逆时针排列的先翻转一次成顺时针排列,省代码
然后按照顺时针排列的处理
但注意第一种情况的计数+1,因为翻转了一次
第2种情况计数-1,因为与第一次翻转抵消(第一次翻转后变回原串)

debug:
判排列的时候,第一个最小值前面一定是最大值
把这个优化加上才可以过,否则超时

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N=2e5+10;

void solve() {
    int n;cin>>n;
    vector<int>a(n);
    int mi=1e9,ma=-1;
    bool su=0;
    for(int i=0;i<n;i++){
        cin>>a[i];
        mi=min(mi,a[i]);
        ma=max(ma,a[i]);
        if(i>0){
            if(a[i]>=a[i-1])continue;
            su=1;
        }
      //  cout<<mi<<' '<<a[i]<<'\n';
    }
    if(su==0){
        cout<<0<<'\n';return ;
    }
    bool f=0;
    int l;
    int ans1=1e9;
    for(int i=0;i<n;i++){
        if(a[i]==mi&&a[(i-1+n)%n]==ma){
            f=0;
            l=i;
            for(int j=i+1;j<n;j++){
                if(a[j]>=a[j-1])continue;
                f=1;break;
            }
            if(f==0){
                for(int j=0;j<l;j++){
                    if(j==0){
                        if(a[j]>=a[n-1])continue;
                        f=1;break;
                    }else{
                        if(a[j]>=a[j-1])continue;
                        f=1;break;
                    }
                }
            }
            if(!f){
                ans1=min({ans1,n-l,l+2});
            //    cout<<"ans1="<<ans1<<' '<<"l="<<l<< '\n';
            break;
            }
        }
    }


    reverse(a.begin(),a.end());
   // cout<<"mi="<<mi<<'\n';
   su=0;
   for(int i=1;i<n;i++){
       if(a[i]>a[i-1])continue;
       su=1;break;
   }
   if(su==0){
       cout<<1<<'\n';
       return ;
   }
    for(int i=0;i<n;i++){
        if(a[i]==mi&&a[(i-1+n)%n]==ma){
            f=0;
            l=i;
       //     cout<<"mi="<<mi<<' '<<"l="<<l<<'\n';
            for(int j=i+1;j<n;j++){
                if(a[j]>=a[j-1]){
                //    cout<<"j="<<j<<' '<<"j-1="<<j-1<<'\n';
                    continue;
                }
                f=1;break;
            }
            if(f==0){
                for(int j=0;j<l;j++){
                    if(j==0){
                        if(a[j]>=a[n-1]){
                     //       cout<<"j="<<j<<' '<<"n-1="<<n-1<<'\n';
                            continue;
                        }
                        f=1;break;
                    }else{
                        if(a[j]>=a[j-1]){
                           // cout<<"j="<<j<<' '<<"j-1="<<j-1<<'\n';
                            continue;
                        }
                        f=1;break;
                    }
                }
            }
            if(!f){
                ans1=min({ans1,n-l+1,l+1});
                //cout<<"ans1="<<ans1<<' '<<"l="<<l<< '\n';
                 break;

            }
        }
    }

    if(ans1==1e9)cout<<-1<<'\n';
    else cout<<ans1<<'\n';
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int left=1;
    cin>>left;
    while(left--){
        solve();
    }
}

标签:10,int,Codeforces,long,while,solve,Div,913,left
From: https://www.cnblogs.com/wwww-/p/18004947

相关文章

  • CodeCraft-22 and Codeforces Round 795 (Div. 2)C. Sum of Substrings(分类讨论、贪
    感觉分类讨论的能有点弱。遇到复杂一点的分类讨论的题目,代码就写的巨长。首先观察到处在中间位置的1对答案的贡献是11,具体在中间哪个位置是没有关系的。只有两端的两个位置是比较特殊的\(1位置处的1对答案的贡献是10\)\(2位置处的1对答案的贡献是1\)所有我们考虑将最左端第一......
  • SMU Winter 2024 div2 ptlks的周报Week 2(1.29-2.4)
    这周学习到的知识点有斯特林数(F鸡数题!)F鸡数题!思路第二类斯特林数代码#include<bits/stdc++.h>#defineintlonglong#defineMOD1000000007usingnamespacestd;intn,m,f[100005],fi[100005];intqpow(inta,intn){ intans=1; while(n){ if(n&1){ ......
  • CodeForces 1918E ace5 and Task Order
    洛谷传送门CF传送门世纪难题。首先我们考虑先固定\(x\),比如让\(x=a_1\)(重复问\(1\)直到回答为=),那么此时我们可以知道任意一个\(a_i\)和\(a_1\)的大小关系(问一次\(i\)再问一次\(1\)),并且可以知道\(a_i\)的具体值。那么剩下的数被分成了两个集合,一个\(<a_1\)......
  • left 2 Codeforces Round 916 (Div. 3)
    题目链接A.遍历字符串,用map记录下每个字符出现的次数最后遍历26个字母,若出现了相应次数答案+1#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;voidsolve(){intn;cin>>n;strings;cin>>s;map<char,int>mp;......
  • 【解题报告】CodeForces523D:Statistics of Recompressing Videos
    CF523D解题报告CF523D先上结果:前两次语言选错了,编译一直不过(做这题是因为集训老师让我做我就做了,要不然我都快忘了我有CF账号了(思路省流:STL大法开一个小根堆存目前正在运行的服务器(也可以大根堆,但是存时间进去的时候存负的),如果有空机就直接处理,这个视频处理完的时间就......
  • Codeforces Round 734 (Div. 3)B2. Wonderful Coloring - 2(贪心构造实现)
    思路:分类讨论:当一个数字出现的次数大于等于k,那么最多有k个能被染色,当一个数字出现的次数小于k,南那么这些数字都可能被染色还有一个条件就是需要满足每个颜色的数字个数一样多,这里记出现次数小于k的所有数字的出现次数总和为sum,将所有这些数字排序后,前sum-sum%k个数字是都可以......
  • Codeforces Round 919 (Div. 2)
    A一笔带过,维护可能的最大值和最小值,并对于3操作特殊维护一下即可。B枚举第一个人删多少个数(贪心的想,一定删最大的几个,因为假如留着一定会对第二个人有利)第二个人一定是翻的越多越好,且翻的都是最大的几个数。使用前缀和容易计算答案。C妙妙题。枚举\(k\),接着发现\(a_i......
  • Codeforces Round 799 (Div. 4)G. 2^Sort
    暴力枚举每一个端点然后去check显然是复杂度为\(O(n^2)\)是来不及的。我们考虑大区间满足小区间一定满足,用两个指针维护一下当前满足不等式的区间,然后长度达到就计算答案。思路很简单,主要是这类双指针的题目里面的一些细节需要注意为了更好写我们总是先维护区间然后再计算答......
  • react 点击按钮 div隐藏显示 添加展开收起动画效果
    js代码const[collapse,setCollapse]=useState(false)  const[showBack,setShowBack]=useState(false)  constchangeCollapse=()=>{//获取展开收起目标元素    constheaderDes=document.querySelector('.phone_header_des');  ......
  • [LeetCode] 2966. Divide Array Into Arrays With Max Difference
    Youaregivenanintegerarraynumsofsizenandapositiveintegerk.Dividethearrayintooneormorearraysofsize3satisfyingthefollowingconditions:Eachelementofnumsshouldbeinexactlyonearray.Thedifferencebetweenanytwoelementsin......