牛乗客フルーツ忍者2018 ACM上海の大都市シーズン(ランダム化アルゴリズム)

トピックリンク:フルーツ忍者
ゲームリンク:レースを再現するために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;
}

おすすめ

転載: www.cnblogs.com/wulitaotao/p/11614489.html
おすすめ