zoukankan      html  css  js  c++  java
  • G

    https://vjudge.net/contest/388843#problem/G

    Notice:Don't output extra spaces at the end of one line.

    Dodo bird and ddd are playing a stone game on a 2-d plane. There are $n$ points on the plane where they can put the stone. The rule is as follows:

    - Before the game start, The stone is at the first point.
    - Dodo and ddd move the stone in turn, Dodo moves first.
    - In the first move, the player can move the stone to any point except the first point.
    - Starting from the second move, assume the stone is currently at point $x$, and the distance of the stone traveled in the last move is $d$. The player can move the stone to a point $y$ if and only if $ ext{distance(x,y)} > d$ and point $y$ has never been visited before.
    - If a player cannot make a move, he loses the game.

    Please determine who will win the game if both player use the best strategy.

    InputThe first line contains an integer $T(1 leq T leq 100)$, indicating the number of test cases.

    Each test case contains several lines. The first line contains an integer $n(2 leq n leq 2000)$, indicating the number of points. Next $n$ lines, each line contains two integers $x_i, y_i(-10^9 leq x, y leq 10^9)$, indicating the coordinate of the i-th point.

    It is guaranteed that there are at most 12 test cases with $n > 500$.
    OutputFor each test case, If Dodo can win the game, print "YES". Otherwise, print "NO".Sample Input

    2
    5
    1 1
    0 0
    2 0
    0 2
    2 2
    4
    1 1
    0 0
    0 2
    2 2

    Sample Output

    NO
    YES

    Sponsor

    题意:
    A,B轮流走,每次走的距离比上一次大。走过的点不能再走,不能走的人输,问先手是否必胜。

    思路:

    参考 https://blog.csdn.net/tomjobs/article/details/107947511

    最后走到最远距离的一对点,一人先走到这些点中行动,另一人就不能再行动了。

    最多只剩下一个最远点 偶数先手胜

    最后只剩下一个点且为点1,1必败。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<bitset>
    #include<cassert>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<ctime>
    #include<deque>
    #include<iomanip>
    #include<list>
    #include<map>
    #include<queue>
    #include<set>
    #include<stack>
    #include<vector>
    #include <vector>
    #include <iterator>
    #include <utility>
    #include <sstream>
    #include <limits>
    #include <numeric>
    #include <functional>
    using namespace std;
    #define gc getchar()
    #define mem(a) memset(a,0,sizeof(a))
    #define debug(x) cout<<"debug:"<<#x<<" = "<<x<<endl;
    
    #define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    
    typedef long long ll;
    typedef unsigned long long ull;
    typedef long double ld;
    typedef pair<int,int> pii;
    typedef char ch;
    typedef double db;
    
    const double PI=acos(-1.0);
    const double eps=1e-6;
    const int inf=0x3f3f3f3f;
    const int maxn=1e5+10;
    const int maxm=2007;
    //const int maxm=100+10;
    const int N=1e6+10;
    const int mod=1e9+7;
    
    struct node
    {
        ll x , y , d;
    };
    node A[maxm];
    node Path[maxm*maxm];
    
    int v[maxm] = {0};
    
    int cmp(node x,node y)
    {
        return x.d < y.d;//递增 
    }
    ll D(int i,int j)
    {
    	int ans = (A[i].x-A[j].x)*(A[i].x-A[j].x)+(A[i].y-A[j].y)*(A[i].y-A[j].y); 
        return ans; 
    }
    int main() {
        int T = 0;
    	cin >> T;
    	
        while(T--)
    	{
            int n = 0;
    		cin >> n;
            for(int i = 0;i<n;i++)
    		{
                cin >> A[i+1].x >> A[i+1].y;
                v[i] = 0;
            }
            int L = 0;
            for(int i = 0;i<n;i++)
    		{
                for(int j = i;j < n;j++)
    			{
    				L += 1;
                    Path[L].x = i+1;
    				Path[L].y = j+1;
    				Path[L].d = D(i+1,j+1);
                }
            }
            sort(Path+1,Path+1+L,cmp);
            
            int X = 0;
    		int Y = 0;
            for(int i = 0;i<L;i++)
    		{
                X = Path[L-i].x;
    			Y = Path[L-i].y;
                if(v[X] || v[Y])
                {
                	continue;
    			}
    			else
    			{
                    n = n - 2;
                    v[X] = 1;
                    v[Y] = 1;
                }
            }
            
            if(n == 0)
    		{
                cout << "YES" <<endl;
            }
    		if(n == 1)
    		{
    			if(v[1]) cout << "YES" <<endl;
            }
       		if(n !=0 && n != 1) cout << "NO" <<endl;
        }
        return 0;
    }
    

      

  • 相关阅读:
    bash:加减乘除(bc、let)
    shell配置文件
    HDU4624 Endless Spin 【最大最小反演】【期望DP】
    SPOJ10707 COT2
    HDU5977 Garden of Eden 【FMT】【树形DP】
    Codeforces1023E Down or Right 【贪心】
    Codeforces1023F Mobile Phone Network 【并查集】【最小生成树】
    UOJ272 [清华集训2016] 石家庄的工人阶级队伍比较坚强 【分治乘法】
    LOJ2721 [NOI2018] 屠龙勇士 【扩展中国剩余定理】
    UOJ268 [清华集训2016] 数据交互 【动态DP】【堆】【树链剖分】【线段树】
  • 原文地址:https://www.cnblogs.com/SutsuharaYuki/p/13512502.html
Copyright © 2011-2022 走看看