所做过的笔试真题

目录

京东20250823

1.小A吃饭问题

  • 示例可以通过,但还是会报-wrong answer,不知道哪里错了
cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

const long MOD = 998244353;
##快速幂(二进制幂):a^b % mod
long long pow_mod(long long a, long long b, long long mod) {
    long long res = 1;
    while (b) {
        if (b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

int main() {
    int n, m, k;
    if (!(cin >> n >> m >> k)) return 0;

    vector<vector<long long>> dp(n + 1, vector<long long>(m + 2, 0));
    // 特判 k=0:如果不加这部分,会报错
    if (k == 0) {
        cout << pow_mod(m, n, MOD) ;
        return 0;
    }


    for (int j = 1; j <= m; ++j) {
        dp[1][j] = 1;
    }
	
    for (int i = 2; i <= n; ++i) {
        vector<long long> prefix(m + 2, 0);
        for (int j = 1; j <= m; ++j) {
            prefix[j] = (prefix[j - 1] + dp[i - 1][j]) % MOD;
        }

        for (int j = 1; j <= m; ++j) {
            int left = 1;
            int right = j - k;
            long long sum = 0;
            if (right >= left) {
                sum += prefix[right] - prefix[left - 1];
                sum %= MOD;
            }

            left = j + k;
            right = m;
            if (right >= left) {
                sum += prefix[right] - prefix[left - 1];
                sum %= MOD;
            }

            dp[i][j] = (sum  + MOD) % MOD;
        }
    }

    long long ans = 0;
    for (int j = 1; j <= m; ++j) {
        ans = (ans + dp[n][j]) % MOD;
    }

    cout << ans;
    
    return 0;
}
  • 错误示例:使用dfs,但超出的执行时间限制
cpp 复制代码
#include <iostream>
#include<vector>
using namespace std;


int dfs(vector<int>& coll,int n,int m,int k){
    if((int)coll.size()==n){
        return 1;
    }
    int ans=0;
    for(int i=1;i<=m;i++){
        if(coll.empty()||abs(i-coll.back())>=k){
            coll.push_back(i);
            ans+=dfs(coll,n,m,k);
            coll.pop_back();
        }
    }
    return ans;
}

int main() {
    long mod=998244353;
    int n,m,k;
    if(!(cin>>n>>m>>k)) return 0;
	
    vector<int> coll;
    int ans=dfs(coll,n,m,k);
    cout<<ans%mod<<endl;
    return 0;
    
}

2.故障机器人

京东20250816

1.序列逆序对优化

cpp 复制代码
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    if (!(cin >> T)) return 0;
    while (T--) {
        int n;
        cin >> n;
        vector<int> arr(n);
        for (int i = 0; i < n; ++i) cin >> arr[i];

        vector<int> totalCount(n + 2, 0);
        for (int v : arr) ++totalCount[v];

        vector<int> seenPrefix(n + 3, 0);
        long long currentGain = 0;
        long long bestGain = 0;

        for (int i = 0; i < n; ++i) {
            bestGain = max(bestGain, currentGain);
            int v = arr[i];
            //这一步死活看不懂
            currentGain += (long long)totalCount[v - 1] - seenPrefix[v - 1] - seenPrefix[v + 1];
            ++seenPrefix[v];
        }
        bestGain = max(bestGain, currentGain);

        cout << bestGain << "\n";
    }
    return 0;
}

2.滑动窗口最大最小值


在线做题链接

python 复制代码
#include <iostream>
#include<vector>
#include <queue>
using namespace std;
int maxwindow(vector<int>& nums, int k){
	auto cmp=[](const pair<int,int>&a,const pair<int,int>&b){
		return a.first>b.first;
    };
    priority_queue <pair<int,int>>maxque;
    priority_queue <pair<int,int>,vector<pair<int,int>>,decltype(cmp)>minque;
    
    long sumwin=0;
    for(int i=0;i<k;i++){
		sumwin+=nums[i];
        maxque.push({nums[i],i});
        minque.push({nums[i],i});
    }
    int ansindex=0;
   
    long ans=(sumwin-maxque.top().first-minque.top().first)/(k-2);
    for(int j=k;j<nums.size();j++){
    	sumwin=sumwin-nums[j-k]+nums[j];
		maxque.push({nums[j],j});
        minque.push({nums[j],j});
        while(maxque.top().second<=(j-k)){
			maxque.pop();
        }
        
        while(minque.top().second<=(j-k)){
			minque.pop();
        }
        long tem=(sumwin-maxque.top().first-minque.top().first)/(k-2);
        if(tem>ans){
			ans=tem;
           ansindex=j-k+1;
        }
        
    }
    return ansindex;
}

int main() {
	ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int a, b;
    if (!(cin >> a >> b)) return 0;
    vector<int> value(a);
    for(int i=0;i<a;i++){
			cin>>value[i];
    }
   
    cout << maxwindow(value,b) +1<< endl;
    return 0;
    
    }

// 64 位输出请用 printf("%lld")

参考答案

京东20250809

1.子序列的字典序

cpp 复制代码
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

vector <int> dicfunc(vector <int>& arr,int k){
	unordered_map<int,int> count;
    for(auto num:arr){
		count[num]++;
    }
    vector<int> coll;
    unordered_map<int,bool> flag;
    
    for(int i=0;i<arr.size();i++){
        count[arr[i]]--;
		if(flag[arr[i]])continue;
        
        while(!coll.empty()&&count[coll.back()]>0&&coll.back()>arr[i]){
			flag[coll.back()]=false;
            coll.pop_back();
        }
        coll.push_back(arr[i]);
        flag[arr[i]]=true;
        
        if(coll.size()==k)break;
        
    }
    return coll;
    
}

int main() {
    int n,k;
    cin>> n>>k;
    vector<int>arr(n);
    for(int i=0;i<n;i++){
		cin>>arr[i];
    }
    vector <int> ans=dicfunc(arr,k);
    for(int i=0;i<k;i++){
		cout<<ans[i];
        if(i!=k-1){
			cout<<" ";
        }
        
    }
    cout<<endl;
    return 0;
}
// 64 位输出请用 printf("%lld")

参考资料