京东第四批笔试(含代码)
比较简单,40分钟就基本ak了
t1没啥好说的,判断一下区间写三个if判断下区间是否相交就可以了,不过别忘了初始答案要赋值成-1。
#include "bits/stdc++.h" using namespace std; int l1,l2,l3,r1,r2,r3; int main(){ cin>>l1>>r1>>l2>>r2>>l3>>r3; int ans = -1; if ((r1 >= l2 && r1<=r2) || (r1 >= l3 && r1 <= r3)) ans = max(ans,r1*2); if ((r2 >= l1 && r2 <= r1) ||(r2 >= l3 && r2 <= r3)) ans = max(ans,r2*2); if((r3 >= l1 && r3 <= r1) ||(r3 >= l2 && r3 <=r2)) ans = max(ans,r3*2); cout<<ans<<endl; }
t2 考虑对b排序,然后通过c求一个前缀最大值,然后对每一个a[i] 二分一下最大能满足的b的下标pos,减去pos再全部加起来即可
#include "bits/stdc++.h" using namespace std; struct discount{ int b; int c; }dis[200005]; int a[200005],pre[200005]; int n,m; bool cmp(discount x,discount y){ return x.b < y.b; } int find(int x){ int l = 1; int r = m; int res = 0; while (l<=r){ int mid = (l+r) >> 1; if(dis[mid].b <= x){ res = mid; l = mid + 1; } else{ r = mid - 1; } } return res; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=m;i++){ cin>>dis[i].b>>dis[i].c; } sort(dis+1,dis+m+1, cmp); for(int i=1;i<=m;i++){ pre[i] = max(pre[i-1],dis[i].c); } long long ans = 0; for(int i=1;i<=n;i++){ int pos = find(a[i]); ans = ans + (a[i] - pre[pos]); } cout<<ans<<endl; }
t3 求一个二维前缀和,然后发现n^3的暴力能过,更优解可以考虑二分一下len(这样铁定能过),就直接提交了。
#include "bits/stdc++.h" using namespace std; int a[1005][1005]; long long pre[1005][1005]; int n,m; int main() { cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; } } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ pre[i][j] = pre[i-1][j] + pre[i][j-1] - pre[i-1][j-1] + a[i][j]; } } long long ans = 0x3fffffff; long long sum = 0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ sum = sum + a[i][j]; } } for(int len=1;len<=min(n,m);len++){ for(int i=1;i<=n-len;i++){ for(int j=1;j<=m-len;j++){ long long now = pre[i+len][j+len] - pre[i+len][j-1] - pre[i-1][j+len] + pre[i-1][j-1]; ans = min(ans,abs(sum - now - now)); } } } cout<<ans<<endl; } // 64 位输出请用 printf("%lld")#如何看待2023届秋招##京东JDS##我的实习求职记录##笔试面试##笔试题目#