1. 程式人生 > 實用技巧 >2020-08-02

2020-08-02

拼多多筆試:

第一題略。

第二題: 模擬每個骰子的旋轉,對每個狀態分組即可。

#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);
}