牛客小白月赛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
using namespace std;
int n;
int a[100005];
int main(){
    cin>>n;
    for(int i=0;i>a[i];
    }
    if(a[0]

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

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

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

#include
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<
#include
using namespace std;
int t;
int main(){
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        int p=sqrt(n);
        cout<

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

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

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

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

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

#include
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>q[i]>>p[i];
        for(int i=0;i

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

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

#include
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

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

容斥,不会。。。 

你可能感兴趣的:(牛客竞赛赛后总结,c++,算法)