牛客周赛 Round 43VP(A-E)+练习赛125VP(A-C)

1.签到:https://ac.nowcoder.com/acm/contest/82394/A

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
    cin>>n;
    if(n%2==1) cout<<-1;
    else
    {
        cout<<n/2<<" "<<n/2;
    }
}

2.暴力:https://ac.nowcoder.com/acm/contest/82394/B

注意到+2,-2奇偶性不变的性质

#include<bits/stdc++.h>
using namespace std;
long long x;
int main()
{
    cin>>x;
    long long ans=1e8;
    for(long long i=1;i<=1e6;i++)
    {
        if(i*i==x)
        {
            cout<<0;
            return 0;
        }
        else if(i*i<x)
        {
            if((x-i*i)%2==0)
            {
                ans=min(ans,(x-i*i)/2);
            }
        }
        else
        {
            if((i*i-x)%2==0) ans=min(ans,(i*i-x)/2);
        }
    }
    cout<<ans;
}

3.前缀和:https://ac.nowcoder.com/acm/contest/82394/C

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
string s;
int A[100010],a[100010],B[100010],b[100010];
int checkd(char c)
{
    if(c>='A'&&c<='Z') return 1;
    return 0;
}
int checkx(char c)
{
    if(c>='a'&&c<='z') return 1;
    return 0;
}
int main()
{
    cin>>s;
    int ck=s.size();
    int ans=1e8;
    s=' '+s;
    for(int i=1;i<=ck;i++)
    {
        A[i]=A[i-1]+checkd(s[i]);
        a[i]=a[i-1]+checkx(s[i]);
    }
    for(int i=ck;i>=1;i--)
    {
        B[i]=B[i+1]+checkd(s[i]);
        b[i]=b[i+1]+checkx(s[i]);
    }
    for(int i=1;i<=ck-1;i++)
    {
        ans=min(ans,a[i]+B[i+1]);
    }
    cout<<ans;
    //for(int i=1;i<=4;i++) cout<<B[i]<<" ";
    //cout<<ans;
}

4.双指针:https://ac.nowcoder.com/acm/contest/82394/D

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int a[100010],b[100010];
int fk;
int n,k;
int cnt;
int main()
{
    cin>>n>>k;
    fk=k;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        if(b[a[i]]==0&&a[i]<=k) fk--;
        b[a[i]]++;
        if(i==k)
        {
            if(fk==0) cnt++;
        }
        else if(i<k) continue;
        else
        {
            b[a[i-k]]--;
            if(b[a[i-k]]==0&&a[i-k]<=k) fk++;
            if(fk==0) cnt++;
        }
    }
    cout<<cnt;
}

5.向量:https://ac.nowcoder.com/acm/contest/82394/E

首先我们把任意两个点连一条边,要是平行四边形就需要两个向量相同,于是我们用map存向量(统一x>0),并用vector保存,然后就把同一个向量取出来,用两条边端点的向量与自己的向量叉乘一下即可,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef pair<long long,long long> pii;
 
map<pii,vector<pii> >mp;
pii a[1002];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i].first>>a[i].second;
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            long long x=a[i].first-a[j].first;
            long long y=a[i].second-a[j].second;
            if(x<0)
            {
               x=-x,y=-y; 
            }
            mp[{x,y}].push_back({i,j});
        }
    }
    long long ans=0;
    for(auto e:mp)
    {
        auto A=e.first;
        for(auto[x,y]:e.second)
        {
            for(auto[xx,yy]:e.second)
            {
                if(x==xx&&y==yy) continue;
                pii B={a[x].first-a[xx].first,a[x].second-a[xx].second};
                ans=max(ans,abs(A.first*B.second-A.second*B.first));
        }
    }
}
    if(ans==0) cout<<-1;
    else cout<<ans<<".0";
}

1.签到:https://ac.nowcoder.com/acm/contest/82612/A

AC代码:

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

struct node
{
    int id,zhi;
};
bool cmp(node a,node b)
{
    if(a.zhi==b.zhi) return a.id>b.id;
    return a.zhi<b.zhi;
}
int main()
{
    cin>>t;
    while(t--)
    {
        node a[5];
        int cnt=0;
        for(int i=0;i<5;i++)
        {
            cin>>a[i].zhi;
            a[i].id=i+1;
        }
        sort(a,a+5,cmp);
        for(int i=0;i<5;i++)
        {
            if(a[i].id==1) break;
            cnt++;
        }
        cout<<4-cnt<<endl;
    }
}

2.简单的博弈:https://ac.nowcoder.com/acm/contest/82612/B

注意:素数-1肯定是偶数,但是我们要特判3-1=2这种情况:

AC代码:

#include<bits/stdc++.h>
using namespace std;
int a[200010];
void init()
{
    for(int i=2;i<=200000;i++)
    {
        int f=0;
        for(int j=2;j*j<=i;j++)
        {
            if(i%j==0)
            {
                f=1;
                break;
            }
        }
        if(f==0) a[i]=1;
    }
}
int main()
{
    int t;
    cin>>t;
    init();
    while(t--)
    {
        int cnt=0;
        int n;
        int w=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int x;
            scanf("%d",&x);
            if(x==3) w++;
            if(a[x]) cnt++;
        }
        if(cnt==0||cnt==w) cout<<-1<<endl;
        else
        {
            cnt-=w;
            if(cnt%2==0) cout<<1<<endl;
            else cout<<0<<endl;
        }
    }
}

3.枚举:https://ac.nowcoder.com/acm/contest/82612/C

我们令x:abc,其中a:最高位,c:最低位,b:中间位,l:10的b的位数次方

那么y=a*l+b+b*10+c,即11*b=y-a*l-c,因此我们枚举a,c,l,计算出y-a*l-c,假如是11的倍数,并前算出来的b<l(比如3位数一定小于1000)那么答案+1.

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int t;
typedef long long ll;
int main()
{
    cin>>t;
    while(t--)
    {
        ll y;
        cin>>y;
        int ans=0;
        for(int a=1;a<10;a++)
        {
            for(int c=0;c<=9;c++)
            {
                for(ll l=1;l<=1e17;l*=10)
                {
                    ll b=y-a*l-c;
                    if(b>=0&&b%11==0&&l>b/11) ans++;
                }
            }
        }
        cout<<ans<<endl;
    }
}

    

  • 10
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值