难度爆炸!拼多多0811秋招笔试

解题思路:

按照优先级排序,从优先级最高开始遍历,同时维护一个当前时间,如果当前时间小于预定时间,则ans等于预定,否则计算至少需要加上多少个Di才能大于等于ans,再将ans赋值。

 

解题思路:

题目要求最短周转时间,其实就是使用可剥夺的短作业优先调度。采用优先队列实现。

还是维护一个当前时间now,答案ans。

从最先到达的作业开始遍历。

将当前作业加入优先队列。

记录下一个到达时间。

优先队列出队直到为空或者做完作业的时间大于下一个到达时间。

无论下次到达是选择继续之前的还是开始新的,都中断统一处理。

解题思路:

翻转一个区间,设-1表示玫瑰,1表示牡丹,区间和为x,那么这个x可以分为x个区间,每个区间和为1,说明区间变化是连续的。只需要找到最大区间和和最小区间和,就可以算出答案。当时又犯病了,最大区间和都忘了(

package org.example;

import java.util.List;
import java.util.Scanner;

public class MyClass {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n=scanner.nextInt();
        int[] arr=new int[n];
        for(int i=0;i<n;i++){
            arr[i]=scanner.nextInt();
            if(arr[i]==0){
                arr[i]=-1;
            }
        }
        int maxn=0,minn=0;
        int maxAns=0,minAns=n;
        for(int i=0;i<n;i++){
            maxn+=arr[i];
            minn+=arr[i];
            if(maxn<0){
                maxn=0;
            }
            if(minn>0){
                minn=0;
            }
            maxAns=Math.max(maxAns,maxn);
            minAns=Math.min(minAns,minn);
        }
        System.out.println(Math.max(maxAns,-minAns)+1);
    }
}

 

难度:区域赛铜牌题目,一股ACM味儿

题意:

哈希函数为f = x % n , 给定一个插入完成的哈希表,要求还原插入顺序,如果多个可能,还原字典序最小的

题解:

很容易想到使用拓扑排序,对于从i位置跳到j位置的数字, 将[i,j-1]的所有点连向j,然后进行拓扑排序+贪心就行,时间复杂度n^2 , 不行

可以考虑优化,删除一个数字之后,一定是右边最靠近这个数字可能被选,可以压进优先队列中,查找右边那个数字可以考虑使用树状数组+二分,时间复杂度nlg^2n

#include<bits/stdc++.h>
using namespace std;
#define ll long long
//坐标从0开始直接用的树状数组
template <typename T>
class Fenwick
{
private:
    int n;
    vector<T> c;
    int lowbits(int x){
        return (-x) & x;
    }
    int pre_sum(int i){
        int re = 0;
        for (; i > 0; i -= lowbits(i))
            re += c[i];
        return re;
    }
public:
    explicit Fenwick<T>(vector<T> v){
        this->n = v.size();
        this->c = vector<T>(n+1,0);
        for(int i=0;i<n;i++)
            add(i,v[i]);
    };
    void add(int i, int val){
        ++i;
        for (;i<=n; i += lowbits(i))
            c[i] += val;
    }
    int range_sum(int i,int j){
        ++i;++j;
        return pre_sum(j) - pre_sum(i - 1);
    }
};


void solve(){
    int n;cin>>n;
    vector<int> a(n);
    for(int &x:a) cin>>x;
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
    map<int,int> mp;
    for(int i =0;i<n;i++){
        if(a[i]==-1) a[i] = 0;
        else if(a[i]%n==i){
            pq.push({a[i],i});
            mp[a[i]] = 1;
        }
    }
    for(int i =0 ;i < n;i++) a.push_back(a[i]);

    vector<int> b = a;
    for(int&x:b) if(x) x = 1;
    Fenwick<int> fw(b);

    vector<int> ans;
    while(pq.size()){
        auto p = pq.top();pq.pop();
        int x = p.first , pos = p.second;
        ans.push_back(x);
        fw.add(pos,-1);fw.add(pos+n,-1);
        int l = pos , r = 2*n;
        while(l+1!=r){
            int m = l+r>>1;
            if(fw.range_sum(pos,m)==0) l = m;
            else r = m;
        }
        l++;
        if(l<2*n&&fw.range_sum(pos,l)==1){
            if(mp[a[l]]) continue; 
            int lp = a[l]%n;
            if(lp > l) l+=n;
            if(fw.range_sum(lp, l - 1)==0){
                mp[a[l]] = 1;
                if(l >= n ) l -= n;
                pq.push({a[l],l});
            }
        }
    }
    for(int x:ans) cout<<x<<" ";
}

signed main(){
    cin.tie(0);cout.tie(0);
    ios::sync_with_stdio(0);
    solve();
}

第四题转载于LittleXi大佬
链接:https://www.nowcoder.com/discuss/652260938636087296?sourceSSR=users
来源:牛客网

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

装B且挨揍の

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值