題目鏈結
簡單中等
困難簡單版本
直接統計答案,數目到達一半即可。
#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 根導...