wgqqq
失敗は終わりではない、諦めるこそが終わりである。ゴールが見えないから人生はおもしろい(失败并非结束,放弃才是完结。正由于看不到终点,人生才有趣。)

因为校集训队以cf成绩为分队指标,所以我决定刷刷div3和div2的ABC题(不涉及算法的题),不学习新的算法了,争取把cf分数打上去,这样才能得到尊重。

之前有一场div2我看错A题题意怎么也调不出来,直接自闭了,于是掉了一百多分...赛后补题发现真的不难(上分起码没啥问题)。

反正,现在训练切简单题目的速度和正确率。


早上virtual participate了这场比赛,只AC了三题....(C题竟然没写出来!!!)

补了题现在把题解挂出来。

A.Circle of Students

扫一遍就好了

 

#include<bits/stdc++.h>
using namespace std;
int a[205];
int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        bool f =true;
        for(int i=1;i<=n-1;i++)
        {
            if(a[i+1]-a[i]!=1&&a[i+1]-a[i]!=-1)
            {
                if((a[i+1]==n&&a[i]==1)||(a[i+1]==1&&a[i]==n))continue;
                else
                {
                    cout<<"NO\n";
                    f=false;
                    break;
                }
            }
        }
        if(f)cout<<"YES\n";
        
    }
    return 0;
 } 

B.Equal Rectangles

排序后,最小的乘以最大的就好了,顺便扫的过程中判断一下能不能构成矩形,即相邻的两个是否相等。

#include<bits/stdc++.h>
using namespace std;
int arr[1005];
int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        int n;
        cin>>n;
        for(int i=1;i<=4*n;i++)
        cin>>arr[i];
        sort(arr+1,arr+1+4*n);
        int cnt=arr[1]*arr[4*n];
        bool f=true;
        for(int i=1;i<=2*n;i+=2)
        {
            
            if(arr[i]*arr[4*n+1-i]!=cnt||arr[i]!=arr[i+1]||arr[4*n+1-i]!=arr[4*n-i])
            {
                cout<<"NO\n";
                f=false;
                break;
            }
         }
         if(f)cout<<"YES\n";
         
        
    }
    return 0;
 } 

C.Common Divisors

WDNMD一开始先看错题目,以为是最大的公约数,看了样例半天没想明白。

后来知道是公约数的个数,结果脑子抽到了循环暴力判断???

其实这个就一直gcd迭代下去,再把结果的因子数计算输出就行...(学了一手快速gcd,以后可以当板子了)

ps:记得long long

#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
const int maxn = 4e5+5;
ll a[maxn];
ll qGCD(ll a, ll b)
{
    if(a == 0) return b;
    if(b == 0) return a;
    if(!(a & 1) && !(b & 1)) // a % 2 == 0 && b % 2 == 0;
        return qGCD(a >> 1, b >> 1) << 1;
    else if(!(b & 1))
        return qGCD(a, b >> 1);
    else if(!(a & 1))
        return qGCD(a >> 1, b);
    else
        return qGCD(abs(a - b), min(a, b));
}

int main()
{
    ios::sync_with_stdio(false);
    ll n;
    cin>>n;
    ll g=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        g=qGCD(a[i],g);
    }
    ll cnt = 0;
    for(ll i=sqrt(g);i>=1;i--)
    {
        if(g%i==0)
        {
            if(i*i==g)cnt++;
            else
            cnt+=2;
        }
    }
    cout<<cnt<<'\n';
    return 0;
   
}

D1.Remove the Substring (easy version)

数据范围小,所以可以从大到小枚举substring的长度,再从前往后枚举删除的位置,最后暴力判断子序列即可。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);
    string s,t;
    cin>>s>>t;
    int slen=s.length(),tlen=t.length();
    if(slen==tlen)
    {
        cout<<0<<'\n';
        return 0;
    }
    for(int i=slen-tlen-1;i>=0;i--)
    {
        for(int pos=0;pos+i<slen;pos++)
        {
            int p1=0,p2=0;
            while(p1<slen&&p2<tlen)
            {
                if(p1>=pos&&p1<=pos+i)
                {
                    p1++;
                    continue;
                }
                if(s[p1]==t[p2])
                {
                    p1++;
                    p2++;
                }
                else
                {
                    p1++;
                }
            //    cout<<p1<<' '<<p2<<'\n';
            }
            if(p2==tlen)
            {
                cout<<i+1<<'\n';
                return 0;
            }
            else
            continue;
        }
        
    }
    return 0;
    
 } 

D2.Remove the Substring (hard version)

看某位大佬的博客看懂了,看官方的英文题解和代码真的看自闭了,链接附在下面。

https://blog.csdn.net/qq_41608020/article/details/99552169

总之就是找到最左满足子序列和最右满足子序列,对于t串中相邻的字符,分别在最左满足序列和最右满足序列中找到符合的位置,相减即为删去的子串长度最大值(对于这两个相邻字符)。

然后从前往后扫一遍,预处理头尾,即可。

#include<iostream>
#include<string>
using namespace std;
const int maxn=2e5+5;
int rp[maxn];
int lp[maxn];
string s,t;
int ans=0;
void findrg()
{
    int ps=s.length()-1;
    int pt=t.length()-1;
    while(pt>=0)
    {
        if(s[ps]==t[pt])
        {
            rp[pt]=ps;
            ps--;
            pt--;
        }
        else
        {
            ps--;
        }
    }
}
void findlg()
{
    int ps=0,pt=0;
    while(pt<t.length())
    {
        if(s[ps]==t[pt])
        {
            lp[pt]=ps;
            ps++;
            pt++;
        }
        else
        {
            ps++;
        }
    }
}
void solve()
{
    int x=s.length()-lp[t.length()-1]-1;//预处理头尾
    ans=max(x,rp[0]);
    for(int i=0;i<t.length()-1;i++)//扫一遍
    {
        ans=max(ans,rp[i+1]-lp[i]-1);
    }
    cout<<ans<<'\n';
}
int main()
{
    ios::sync_with_stdio(false);
    cin>>s>>t;
    findrg();
    findlg();
    /*for(int i=0;i<t.length();i++)
    {
        cout<<rp[i]<<" ";
    }
    cout<<'\n';*/
    /*for(int i=0;i<t.length();i++)
    {
        cout<<lp[i]<<" ";
    }
    cout<<'\n';*/
    solve();
    return 0;
    
    
 } 

 

E.Boxers

 

先排序,然后搞个now,从1开始循环,判断每个数字是否能够出现。

#include<bits/stdc++.h>
using namespace std;
int arr[150005];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>arr[i];
    }
    sort(arr+1,arr+1+n);
    int now=1,cnt=0;
    for(int i=1;i<=n;i++)
    {
        if(now-arr[i]>=-1&&now-arr[i]<=1)
        {
            now++;
            cnt++;
        } 
        else
        {
            if(arr[i]-1>=now)

            {
            now=arr[i];
            cnt++;
            }
        }

    }
    cout<<cnt<<'\n';
    
 } 

F1.Complete the Projects (easy version)

按bi的正负将输入的数据分成两组,按照规则排个序然后扫一遍判断就好了,排序规则看代码就好了

#include<bits/stdc++.h>
using namespace std;
struct state{
    int a,b;
};
bool cmp(state x,state y)
{
    if(x.b>=0&&y.b>=0)
    {
        if(x.a!=y.a)
        return x.a<y.a;
        else
        return x.b<y.b;
    }
    else
    {
        return x.a+x.b>y.a+y.b;
    }
}
state po[105],ne[105];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int cnt1=1,cnt2=1;
    int n,r;
    cin>>n>>r;
    int a,b;
    for(int i=1;i<=n;i++)
    {
        cin>>a>>b;
        if(b>=0)
        {
            po[cnt1].a=a;
            po[cnt1].b=b;
            cnt1++;
        }
        else
        {
            ne[cnt2].a=a;
            ne[cnt2].b=b;
            cnt2++;
        }
    }
    sort(po+1,po+cnt1,cmp);
    sort(ne+1,ne+cnt2,cmp);
    for(int i=1;i<cnt1;i++)
    {
        if(r<po[i].a)
        {
            cout<<"NO\n";
            return 0;
        }
        else
        r+=po[i].b;
    }
    for(int i=1;i<cnt2;i++)
    {
        if(r<ne[i].a||r<0)
        {
            cout<<"NO\n";
            return 0;
        }
        else
        r+=ne[i].b;
    }
    if(r>=0)cout<<"YES\n";
    else
    cout<<"NO\n";
    return 0;
} 

 

F2.Complete the Projects (hard version)

出了补。

 

 

 

 

 

 

over

 

posted on 2019-08-16 21:19  wgqqq  阅读(198)  评论(0编辑  收藏  举报