1. 程式人生 > >2018 ACM 國際大學生程序設計競賽上海大都會賽重現賽 A Fruit Ninja

2018 ACM 國際大學生程序設計競賽上海大都會賽重現賽 A Fruit Ninja

get pair 分享 return out 如果 mage 設計 target

傳送門

題解:給你一堆點問你能不能找出一條直線,使其穿過的點大於n*x。

題解:想起某道CF題目,給你一堆點問你能不能找出兩條直線使其穿過所有的點。當時就是在一定時限內隨機找了兩個點,再枚舉每個點是否滿足,如果超過該時限仍然不滿足則直接返回no。這題也是一樣的做法,直接隨機兩個點,再枚舉過去。因為x為0.1到0.9,所以如果所給數據滿足條件,那麽它有極大概率能夠跑出結果。4發只有一次超時

技術分享圖片

#include<bits/stdc++.h>
//CLOCKS_PER_SEC
#define se second
#define fi first
#define ll long long
#define
Pii pair<int,int> #define Pli pair<ll,int> #define ull unsigned long long #define pb push_back #define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) const double Pi=3.14159265; const int N=1e4+10; const ull base=163; const int INF=0x3f3f3f3f; const ll mod=1e9+7; using namespace
std; Pii p[N]; int main(){ int T;scanf("%d",&T); while(T--){ int n;double X;scanf("%d%lf",&n,&X); for(int i=1;i<=n;i++){ scanf("%d%d",&p[i].fi,&p[i].se); } if(n<=2){ puts("Yes\n"); continue
; } int m=ceil(n*X); int flag=0; for(int pp=0;pp<1000;pp++){ int x=rand()%n+1,y=rand()%n+1; while(y==x)y=rand()%n+1; double a=1.0*(p[y].se-p[x].se)/(p[y].fi-p[x].fi); // cout<<"a. "<<a<<endl; int s=2; for(int j=1;j<=n;j++){ if(j==x||j==y)continue; double b=1.0*(p[j].se-p[x].se)/(p[j].fi-p[x].fi); // cout<<b<<endl; if(b==a)s++; if(s>=m){ flag=1; break; } } if(flag==1)break; } if(flag)puts("Yes"); else puts("No"); } return 0; }

2018 ACM 國際大學生程序設計競賽上海大都會賽重現賽 A Fruit Ninja