Vmware 笔试
前言:两道题都只拿一大半分数,并未 AC,欢迎提错!
1、从两个数组中分别选取一个数,使得 (a+b)%p 最小,1<=a,b, p<=1e18, size1, size2 <= 100000
// 感觉一个简单的二分就可,错误的部分已经xiug #include <cstdio> #include <iostream> #include <algorithm> using namespace std; const int MAXNM = 1e5+5; typedef long long ll; int main() { int n, m; ll p, nn[MAXNM], nm[MAXNM]; scanf("%d%d%lld", &n, &m, &p); for(int i = 0; i < n; i++) { scanf("%lld", &nn[i]); } for(int i = 0; i < m; i++) { scanf("%lld", &nm[i]); } sort(nm, nm+m); ll ans = p; for(int i = 0; i < n; i++) { // 可以简化 if(nn[i] + nm[0] >= p) { ans = min(ans, (nn[i]+nm[0])%p); } else if(nn[i]+nm[m-1] <= p) { //ans = min(ans, (nn[i]+nm[m-1])%p); error ans = min(ans, (nn[i]+nm[0])%p); } else { int left = 0, right = m-1; while(left < right) { int mid = (left+right)>>1; if(nn[i] + nm[mid] >= p) { right = mid; } else { left = mid+1; } } // 两种情形:nn[i]+nm[right]>p & nn[i]+nm[right]=p ans = min(ans, (nn[i]+nm[right])%p); // ans = min(ans, (nn[i]+nm[right-1])%p); error ans = min(ans, (nn[i]+nm[0])%p); } } cout << ans << '\n'; }
3、n 种色调,冷色调为负数,暖色调为正数,现给定 n 种色调 和 x(色调最大值绝对值),加最少的色调使色调和为 0, n,x <= 1000
// 因为是最后提交的,没太清楚到底 AC 了没有,不过 s/k+1都有一大半分数,这里考虑 s 为负数情况 int ans = 0; if(s != 0) { // s 为累加色调和 ans = abs(s)/k + abs(s)%k != 0; }
#笔试题目##VMware#2 题 有朋友不介意可以补充一下