• HDU6850 Game


    题意:给出N个点,你从第一个给出的点出发,每次只能经过未经过的点且行走的距离要大于上一次行走的距离(第一次行走不限)。当有人无法再进行操作时输。

    思路:暴力存储每两个点之间的距离并排序。然后从最大的那条边开始,把他的两个端点标记(有多条就全部标记),再标记两个端点都未标记过的次大边,,直到所有边都操作完毕。最后看1是否标记来判断输赢。

    原因:某个人在最大边时,如果在其中一个端点,那么对手可以走到另一个端点,这是必败态。在次大边的一个端点时,对手可以走到次大边的另一个端点。那么只能走到最大边的一个端点或者无路可走,递归到上一个状态,也是必败态。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    #include<map>
    #include<queue>
    #include<vector>
    #include<string>
    #define ll long long
    #define PI acos(-1.0)
    #define F first
    #define S second
    #define pb push_back
    #define debug(x); printf("debug%d
    ",x);
    #define des(x); printf("des:%s
    ",x+1);
    const ll INF=0x3f3f3f3f3f3f3f3f;
    const int inf=0x3f3f3f3f;
    const ll mod=1e9+7;
    using namespace std;
    const int N=2020202;
    struct node
    {
        ll x,y;
        //ll val;
    }q[2020];
    struct node1
    {
        int u,v;
        ll val;
    }arr[N];
    int vis[2020];
    int n,t;
    bool cmp(node1 a,node1 b)
    {
        return a.val>b.val;
    }
    ll juli(int i,int j)
    {
        return (q[i].x-q[j].x)*(q[i].x-q[j].x)+(q[i].y-q[j].y)*(q[i].y-q[j].y);
    }
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            memset(vis,0,sizeof vis);
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
            {
                scanf("%lld%lld",&q[i].x,&q[i].y);
            }
            int cnt=0;
            for(int i=1;i<n;i++)
            {
                for(int j=i+1;j<=n;j++)
                {
                    arr[++cnt].val=juli(i,j);
                    arr[cnt].u=i;
                    arr[cnt].v=j;
                }
            }
            sort(arr+1,arr+1+cnt,cmp);
            int pos=1;
            while(pos<=cnt)
            {
                int pre=pos;
                while(arr[pos].val==arr[pre].val)
                    pos++;
                for(int i=pre;i<pos;i++)
                {
                    if(!vis[arr[i].u]&&!vis[arr[i].v])
                    {
                        vis[arr[i].u]=1;
                        vis[arr[i].v]=1;
                    }
                }
            }
            if(vis[1])
                printf("YES
    ");
            else
                printf("NO
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    查漏补缺:QT入门
    添砖加瓦:设计模式(工厂方法模式)
    Luogu 4784 [BalticOI 2016 Day2]城市
    Luogu 1606 [USACO07FEB]白银莲花池Lilypad Pond
    Luogu 3698 [CQOI2017]小Q的棋盘
    CF547D Mike and Fish
    Luogu 3066 [USACO12DEC]逃跑的BarnRunning Away From…
    Luogu 2403 [SDOI2010]所驼门王的宝藏
    NEERC17 J Journey from Petersburg to Moscow
    Luogu 3350 [ZJOI2016]旅行者
  • 原文地址:https://www.cnblogs.com/switch-waht/p/13490087.html
Copyright © 2020-2023  润新知