2020-08-02
阿新 • • 發佈:2020-08-03
拼多多筆試:
第一題略。
第二題: 模擬每個骰子的旋轉,對每個狀態分組即可。
#include <bits/stdc++.h> using namespace std; int v[7][7][7][7][7][7]; int cnt = 0; bool vis[7]; void rotate(vector<int> a){ if(v[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]]) return; v[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]] = cnt; int tmp = a[0]; a[0] = a[5]; a[5] = a[1]; a[1] = a[4]; a[4] = tmp; rotate(a); tmp = a[0]; a[0] = a[4]; a[4] = a[1]; a[1] = a[5]; a[5] = tmp; tmp = a[3]; a[3] = a[4]; a[4] = a[2]; a[2] = a[5]; a[5] = tmp; rotate(a); tmp = a[3]; a[3] = a[5]; a[5] = a[2]; a[2] = a[4]; a[4] = tmp; } void dfs(vector<int> a, int step){ if(step==6){ if(v[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]]) return; cnt++; rotate(a); return; } for(int i=1;i<=6;i++){ if(vis[i]) continue; vis[i] = 1; a.push_back(i); dfs(a, step+1); a.pop_back(); vis[i] = 0; } } int a[10]; map<int,int> m; int ans[1000]; bool cmp(int a,int b){ return a>b; } int main(){ vector <int> b; dfs(b,0); int n; scanf("%d",&n); int cnt=0; for(int i=0;i<n;i++){ for(int i=0;i<6;i++){ scanf("%d",&a[i]); } int cla = v[a[0]][a[1]][a[2]][a[3]][a[4]][a[5]]; if(m.count(cla)) { ans[cla]++; }else{ m[cla] = 1; ans[cla]=1; cnt++; } } printf("%d\n",cnt); sort(ans,ans+1000,cmp); for(int i=0;i<cnt;i++) printf("%d ",ans[i]); }
第三題:
偏序問題
實際上就是要你求, a集合{(X1,Y1),(X2,Y2),(Xn,Yn)} ,b集合{(A1,B1),(A2,B2),(Am,Bm)} 中找到
min(Xi + Aj) subject. Yi+Bj<=T
思路是列舉a集合,將b集合按照 B 從小到大排序之後,使用一個MIN陣列維護 bi ~ bm 中 A的最小值。
每次二分查詢第一個大於等於 T-Yi 的數,然後查詢當前的 MIN[i] 即可。
int MIN[100005]; int main(){ int n,m,T; vector <pair<int,int> > a,b; vector <int >c; scanf("%d%d%d",&n,&m,&T); int ans = 1e9; if(T==0) ans = 0; for(int i=0;i<n;i++){ int x,y; scanf("%d%d",&x,&y); a.push_back({y,x}); if(y>=T) ans = min(ans,x); } sort(a.begin(), a.end()); /// 按照 for(int i=0;i<m;i++){ int x,y; scanf("%d%d",&x,&y); b.push_back({y,x}); if(y>=T) ans = min(ans,x); } sort(b.begin(), b.end()); /// 按照美味值從小到大進行排序 for(int i=0;i<m;i++) c.push_back(b[i].first); MIN[m-1] = b[m-1].second; for(int i=m-2; i>=0;i--){ MIN[i] = min(MIN[i+1],b[i].second); } for(int i=0;i<n;i++){ int need = T-a[i].first; int pos = lower_bound(c.begin(),c.end(),need) - c.begin(); //printf("%d %d\n",need, pos); if(pos < m){ //printf("** %d %d\n",a[i].first, MIN[pos]); ans = min(ans, a[i].second + MIN[pos]); } } if(ans==1e9) printf("-1"); else printf("%d\n",ans); }