Codeforces Round #828 (Div. 3)-C+D

C

题目链接:https://codeforces.com/contest/1744/problem/C

C题一开始有个暴力的思路,就是从前往后搜索,找到当前c所对应的最近的g的路径,同时记录最大值。但是这个是O(n2)的时间复杂度,我猜可能过不了。《===待尝试

看了官方的解析,现在思考为什么他的方法是O(n)。其实我的想法也可以O(n),但是我更习惯于暴力搜索,所以说,还是题目做的太少了。

两个亮点:

  ①将string s复制一遍放在s的后面,方便直接计算需要首尾循环的最短长度。

  ②从后往前遍历数组,同时记录g的位置,一减即得当前的最短,再用ans统计答案即可。

最终代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long

inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    return x*f;
}

using namespace std;
const int maxm=2e5+5,inf=0x3f3f3f3f;
int n;
char c;
string ss;

void solve(){
    cin>>n>>c>>ss;
    ss+=ss;
    int len=ss.length(),lastg=-1,ans=0;
    for(int i=len-1;i>=0;--i){
        if(ss[i]=='g') lastg=i;
        else if(ss[i]==c&&lastg!=-1) ans=max(ans,lastg-i);
    }
    cout<<ans<<endl;
    return ;
}

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



D

题目链接:https://codeforces.com/contest/1744/problem/D

这道题目,主要就是判断能不能找到足够的因子2,让其可以被2n整除。中途有许多值得注意的地方,详见代码吧,夜深了现在。

时间复杂度和空间复杂度都蛮高的,仅供参考思路。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define mem(x,y) memset(x,y,sizeof(x))
//#define int long long

inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    return x*f;
}

using namespace std;
const int maxm=2e5+5,inf=0x3f3f3f3f;
ll n,a,y[maxm];
map<int,int> s;

void solve(){
    cin>>n;
    s.clear();
    int ans=-1,cur=0,temp;
    for(int i=0;i<n;++i){
        cin>>a;
        if(s[a]==0){
            temp=a;
            while(temp%2==0){
                ++s[a];
                temp/=2;
            }
        }
        cur+=s[a];
    }
//    cout<<n<<"..."<<cur<<endl;
    int cnt[20]{};
    if(cur<n){
        //此处判断存在一点小小的复杂情况
        for(int i=1;i<=n;++i){
            ++cnt[y[i]];
        }
        ans=0;
        for(int i=19;i>=0;--i){
            while(cur<n&&cnt[i]){
                cur+=i;//此处是i不是cnt[i]
                --cnt[i];
                ++ans;
            }
        }
        if(cur<n) ans=-1;
    }else ans=0;
    cout<<ans<<endl;
    return ;
}

signed main(){
    int c;
    for(int i=1;i<maxm;++i){
        c=i;
        while(c%2==0){
            ++y[i];
            c/=2;
        }
    }
//    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    int _=1;
    cin>>_;
    while(_--){
        solve();
    }
    return 0;
}
posted @ 2022-10-18 20:08  Qiansui  阅读(34)  评论(0)    收藏  举报