牛客小白月赛72

思路有了码不上来???离大谱,得加训咯 ,编码能力有点差难蚌

目录

A-跳跃游戏_牛客小白月赛72 (nowcoder.com)

B-数数_牛客小白月赛72 (nowcoder.com) 

C-操作数组_牛客小白月赛72 (nowcoder.com) 

D-遗迹探险_牛客小白月赛72 (nowcoder.com) 

E-顶级厨师_牛客小白月赛72 (nowcoder.com) 

F-排座位_牛客小白月赛72 (nowcoder.com) 


A-跳跃游戏_牛客小白月赛72 (nowcoder.com)

一开始以为是看数组是不是从小到大排序的,结果挂了几次,还是要认真看看题,下次一定

#include<bits/stdc++.h>
using namespace std;
int n;
int a[100005];
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    if(a[0]<a[n-1])cout<<"YES";
    else cout<<"NO";
    return 0;
}

B-数数_牛客小白月赛72 (nowcoder.com)

虽然知道是个规律题,但是看了一下数据量不是很大,开个数组暴力求出每个数对应的结果即可,

对sqrt(n)向下取整就是答案

#include<bits/stdc++.h>
using namespace std;
int t;
int a[4005];
int main(){
    cin>>t;
    for(int i=1;i<=4000;i++){
        int cnt=0;
        for(int j=1;j<=i;j++){
            if(i%j==0){
                cnt++;
            }
        }
        a[i]+=a[i-1];
        if(cnt%2!=0)a[i]++;
    }
    while(t--){
        int n;
        cin>>n;
        cout<<a[n]<<"\n";
    }
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int t;
int main(){
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int p=sqrt(n);
        cout<<p<<"\n";
    }
    return 0;
}

C-操作数组_牛客小白月赛72 (nowcoder.com)

统计大于的总值和小于的总值是否相等即可

#include<bits/stdc++.h>
using namespace std;
int n;
int a[100005],b[100005];
long long l,r;
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0;i<n;i++){
        cin>>b[i];
        if(a[i]>b[i])l+=a[i]-b[i];
        else r+=b[i]-a[i];
    }
    if(l==r)cout<<l;
    else cout<<"-1";
    return 0;
}

D-遗迹探险_牛客小白月赛72 (nowcoder.com)

一个数组记录从1,1到i,j的最大值,另一个数组记录从n,m到i,j的最大值。然后判断传送门的位置,找到1,1到其中某个传送门的最大值加上某个传送门的位置到n,m的最大值,记录下最大的结果然后输出,注意:不能从这个传送门传送到自己这个传送门的位置

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m,t;
ll a[1005][1005],b[1005][1005];
int q[6],p[6];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            b[i][j]=a[i][j];
            if(i==1&&j==1)a[i][j]=a[i][j];
            else if(i==1) a[i][j]=a[i][j-1]+a[i][j];
            else if(j==1) a[i][j]=a[i-1][j]+a[i][j];
            else a[i][j]=max(a[i][j-1]+a[i][j],a[i-1][j]+a[i][j]);
        }
    }
    for(int i=n;i>=1;i--){
        for(int j=m;j>=1;j--){
            if(i==n&&j==m)b[i][j]=b[i][j];
            else if(i==n) b[i][j]=b[i][j+1]+b[i][j];
            else if(j==m) b[i][j]=b[i+1][j]+b[i][j];
            else b[i][j]=max(b[i][j+1]+b[i][j],b[i+1][j]+b[i][j]);
        }
    }
    cin>>t;
    while(t--){
        int k;
        cin>>k;
        ll ans=a[n][m];
        for(int i=0;i<k;i++)cin>>q[i]>>p[i];
        for(int i=0;i<k;i++){
            for(int j=0;j<k;j++){
                if(i!=j){
                    ans=max(ans,a[q[i]][p[i]]+b[q[j]][p[j]]);
                }
            }
        }
        cout<<ans<<"\n";
    }
    return 0;
}

E-顶级厨师_牛客小白月赛72 (nowcoder.com)

二分答案,大概思路在代码中写了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m,k,q;
ll y;
ll a[100005],b[100005],c[1000005];
bool check(ll x){
    ll cnt=0;
    for(int i=1;i<=n;i++){
        cnt+=upper_bound(b+1,b+m+1,x/a[i])-b-1;//计算出比x小的总数量(a[i]*b[j]<=x的总数)
    }
    cnt-=upper_bound(c+1,c+k+1,x)-c-1;//减掉限制的数量
    return cnt>=y;
    //如果小于美味值的数大于等于y,表示现在的范围过大,要减少有边界;反之增大左边界
}
int main(){
    cin>>n>>m>>k>>q;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++)cin>>b[i];
    for(int i=1;i<=k;i++){
        int u,v;
        cin>>u>>v;
        c[i]=a[u]*b[v];//标记不能用的
    }
    //三种都排序
    sort(a+1,a+n+1);
    sort(b+1,b+m+1);
    sort(c+1,c+k+1);
    while(q--){
        cin>>y;//要找到最小的
        ll l=a[1]*b[1],r=a[n]*b[m];//二分美味值
        while(l<r){
            ll mid=(l+r)/2;
            if(check(mid))r=mid;
            else l=mid+1;
        }
        cout<<l<<"\n";
    }
    return 0;
}

F-排座位_牛客小白月赛72 (nowcoder.com)

容斥,不会。。。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值