トピックリンク:フルーツ忍者
ゲームリンク:レースを再現するために2018年ACM国際大学対抗プログラミングコンテスト上海大都市レース
タイトル説明
フルーツ忍者は、フワフワで、世界中の数百万人のプレイヤーが楽しむジューシーなアクションゲームです
スプラットと満足果物の大虐殺!すべてのスラッシュと甘い、おいしい破壊の究極の運び手になります。
フルーツ忍者は、人々は、画面をタッチすることで、果実を切断楽しむことができ、携帯電話上の非常に人気のゲームです。
この問題では、スクリーンは矩形であり、そしてすべての果物点とみなすことができます。タッチは、直線切断であります
画面全体を考え、行のすべての果物がカットされます。
場合にタッチが優れている(\ \ FRAC {M} {N} \ GE第X \) 、(\(N \)は、画面における果実の総数であり、\(M \)は、によって切断果実の数でありますタッチ、\(のx \)は実数である。)
今、あなたが与えられた\(N \)果物画面内の位置は、あなたは優秀なタッチを存在するかどうかを知りたいです。
説明を入力します。
入力の最初の行は、\(T(1 \ルT \ル100)\)をあなたが解決する必要があるテストケースの数を表しています。
それぞれの場合の最初の行は、整数含ま\(N(1 \ルN \ル10 ^ 4)\)と実数\(X(0 <X <1)\) 、上述したように。
実数は小数点以下のみ1桁になります。
次\(N \)ライン、各ラインは、2つの整数を含む\(X_I \)と\(Y_I(-10 ^ 9≤X_I、Y_I≤10 ^ 9)\) 、果実の座標を意味します。
出力説明:
各テストケースのために、出力「はい」とは、少なくとも1つの優れた接触がある場合。それ以外の場合は、出力「いいえ」。
例1
エントリー
2 5 0.6 -1 -1 20 1 1 20 5 5 9 9 5 0.5 -1 -1 20 1 1 20 2 5 9 9
輸出
Yes No
問題の意味
所与\(N \)点と実数\(X \) 、ストレート、直線が存在するかどうかの\(N \)の点\(M \)点、および\(\ FRAC {M {N} \ GE X \) 。
考え
乱択アルゴリズム
点の数(同じ傾き)を比較してランダムに選択された二点直線形状、直線は、以上で\(N * X \) 。
コード
#include <bits/stdc++.h>
using namespace std;
typedef double db;
const int maxn = 1e4 + 10;
class Point {
public:
db x, y;
Point(db x = 0, db y = 0) : x(x), y(y) {}
void input() {
scanf("%lf%lf", &x, &y);
}
};
Point p[maxn];
int main() {
int T;
scanf("%d", &T);
while(T--) {
int n;
db x;
scanf("%d%lf", &n, &x);
x *= n;
for(int i = 0; i < n; ++i) {
p[i].input();
}
int flag = 0;
for(int i = 0; i < 1000; ++i) {
int a = rand() % n, b = rand() % n;
while(a == b) a = rand() % n;
db cnt = 2;
for(int j = 0; j < n; ++j) {
if(j == a || j == b) continue;
if((p[j].y - p[a].y) * (p[b].x - p[j].x) == (p[j].x - p[a].x) * (p[b].y - p[j].y)) {
++cnt;
}
}
if(cnt >= x) {
flag = 1;
break;
}
}
if(flag) printf("Yes\n");
else printf("No\n");
}
return 0;
}