計蒜客 商湯科技的行人檢測(隨機化 計算幾何)

2022-05-27 22:39:11 字數 3287 閱讀 4781

題目鏈結

簡單中等

困難簡單版本

直接統計答案,數目到達一半即可。

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

int n;

int a, b, c, d;

pair ans;

map , int > mp;

int main()];

if (mp >= (n + 1) / 2) ans = ;

} printf("%d %d\n", ans.first, ans.second);

return 0;

}

中等版本

題面和簡單版本不一樣。

我們可以通過兩組變化解出一組行人的移動引數

具體的解法是

scale可以通過變換後兩點之間距離的倍數關係求出

旋轉座標前兩個點形成的直線向量a,和旋轉座標後的兩個點形成的直線向量b

那麼θ就是a,b的夾角,然後用一下公式$cosθ=\frac$, 就能算出角度了。

那麼dx, dy就很好求了。

我們兩兩枚舉所有的變化,求出引數,然後驗證一下在n組變化中吻合次數是否到達一半。

(注意eps要開1e-4,我之前開了1e-8一直wa)

時間複雜度$o(n^3)$

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

const int n = 1e5 + 10;

const double eps = 1e-4;

struct node

void print()

friend node operator - (const node &a, const node &b);

} friend node operator + (const node &a, const node &b);

} friend bool operator == (const node &a, const node &b)

} a[n], b[n];

struct node

} ret;

int n;

double dis(const node &a, const node &b)

double angle(const node &a)

node calc(double ang, node a)

bool judge(node cnt)

return true;

}node solve(int x, int y);

ret.cita = angle(b[y] - b[x]) - angle(a[y] - a[x]);

ret.scale = dis(b[x], b[y]) / dis(a[x], a[y]);

node cnt = calc(ret.cita, a[x]);

ret.dx = b[x].x - ret.scale * cnt.x;

ret.dy = b[x].y - ret.scale * cnt.y;

return ret;

}int main()

if (n == 1)

bool flag = false;

rep(i, 1, n - 1)

} if (flag) break;

} ret.print();

return 0;

}

困難版本

因為錯誤的引數不超過一半,那麼我們選擇乙個點,他的引數錯誤的概率不超過0.5

所以我們選擇兩個點,這兩個點至少有乙個點的引數錯誤的概率不超過0.75

我們隨機列舉100次,那麼列舉得到的的100組引數都錯的概率為$0.75^$,幾乎為0

但是中等的**交到困難版本這邊是tle的,為什麼呢。

因為中等的**是有序列舉的,如果前面很多的點引數都是錯的,那麼就列舉不到正確答案,於是就tle了。

時間複雜度$o(100n)$

#include using namespace std;

#define rep(i, a, b) for (int i(a); i <= (b); ++i)

#define dec(i, a, b) for (int i(a); i >= (b); --i)

const int n = 1e5 + 10;

const double eps = 1e-4;

struct node

void print()

friend node operator - (const node &a, const node &b);

} friend node operator + (const node &a, const node &b);

} friend bool operator == (const node &a, const node &b)

} a[n], b[n];

struct node

} ret;

int n;

double dis(const node &a, const node &b)

double angle(const node &a)

node calc(double ang, node a)

bool judge(node cnt)

return true;

}node solve(int x, int y);

ret.cita = angle(b[y] - b[x]) - angle(a[y] - a[x]);

ret.scale = dis(b[x], b[y]) / dis(a[x], a[y]);

node cnt = calc(ret.cita, a[x]);

ret.dx = b[x].x - ret.scale * cnt.x;

ret.dy = b[x].y - ret.scale * cnt.y;

return ret;

}int main()

if (n == 1)

rep(case, 1, 100)

ret.print();

return 0;

}

計蒜客 商湯科技的行人檢測(困難) 概率 幾何

分類 mathprobability 計蒜客 商湯科技的行人檢測 困難 在這道題中,我們將行人的移動過程抽象為 旋轉 伸縮 平移,有 4 個 移動引數 scal e,dx dy 每次行人的移動過程會將行人對應的 nn 個點全部依次應用旋轉 伸縮 平移,對於平移前的點 x,y x,y 進行每種操作後的...

計蒜客 商業資訊共享

有 n個公司,從每個公司都能單向地向另外乙個公司分享最新商業資訊,因為他們之間有著某種合作,你需要解決兩個問題 現在有乙個最新的商業資訊,至少需要告訴多少個公司,使得所有的公司最終都能得到該資訊。在原有基礎上,至少需要再讓多少對公司建立這種合作,使任意乙個公司獲得某個最新商業資訊後,經過若干次分享,...

2017計蒜之道初賽第四場 商湯科技的安全令牌

商湯科技致力於引領人工智慧核心 深度學習 技術突破,構建人工智慧 大資料分析行業解決方案。作為一家人工智慧公司,用機器自動地解決各類實際問題自然不在話下。近日,商湯科技推出了一套安全令牌,令牌如下圖所示 安全令牌上的小孔有 nn 行 mm 列,不過有些行和有些列已經用導線整體焊接了,共有 kk 根導...