10.15 滴滴笔试
1、能够同时操作的最大个数;思路:排序后暴力 100%;本来想优化的,结果直接过了haha;
#include <bits/stdc++.h> using namespace std; int main(){ int n, k; cin >> n >> k; vector<int> nums(n); for(int i=0; i< n; i++){ cin >> nums[i]; } sort(nums.begin(), nums.end()); int ret = 0; for(int i=0; i< n-ret; i++){ int j = i; while(j< n&& nums[j]-nums[i]<= k) j += 1; ret = max(ret, j-i); } cout << ret; return 0; }
2、安排不同的路线总数;思路:先按照区间开始和末尾排序,然后计算从当前开始到末尾有重合的个数,然后选取就好了;100%
#include <bits/stdc++.h> using namespace std; int main(){ int n; cin >> n; vector<pair<int, int>> plans(n); unordered_map<int, int> has_inter; for(int i=0; i< n; i++){ cin >> plans[i].first; } for(int i=0; i< n; i++){ cin >> plans[i].second; } sort(plans.begin(), plans.end()); for(int i=0; i< n; i++){ int left =i+1, right = n-1; while(left<= right){ int mid = (left+right)/2; if(plans[mid].first<= plans[i].second) left = mid+1; else right = mid-1; } has_inter[i] = left-i-1; } vector<int> post(n, 0); for(int i=n-1; i>= 0; i--){ post[i] = (n-i-1) - has_inter[i]; if(i != n-1) post[i] += post[i+1]; } long ret = 0; for(int i=0; i< n; i++){ int j=i+1; while(j< n&& plans[j].first<= plans[i].second) j += 1; if(j< n) ret += post[j]; } cout << ret; return 0; }
美团、百度、小米等大厂都AK了,到现在都没有面试,大厂的笔试做着玩玩就好了;
#10.15滴滴笔试#