射击游戏(牛客网 网易2018校招题 思维+暴力)

版权声明:欢迎转载,转载请注明原博客网址 https://blog.csdn.net/qq_37497322/article/details/82592509

小易正在玩一款新出的射击游戏,这个射击游戏在一个二维平面进行,小易在坐标原点(0,0),平面上有n只怪物,每个怪物有所在的坐标(x[i], y[i])。小易进行一次射击会把x轴和y轴上(包含坐标原点)的怪物一次性消灭。
小易是这个游戏的VIP玩家,他拥有两项特权操作:
1、让平面内的所有怪物同时向任意同一方向移动任意同一距离
2、让平面内的所有怪物同时对于小易(0,0)旋转任意同一角度
小易要进行一次射击。小易在进行射击前,可以使用这两项特权操作任意次。

小易想知道在他射击的时候最多可以同时消灭多少只怪物,请你帮帮小易。

如样例所示:

所有点对于坐标原点(0,0)顺时针或者逆时针旋转45°,可以让所有点都在坐标轴上,所以5个怪物都可以消灭。

ps:

补的第二题,还有一题dp太难了看题解都看不懂。。

题解:

看了评论的解法才写出来的,先选择3个不共线的点,前两个点构造一条直线,后面一个点构造一条垂直于前一条直线的直线,

然后枚举剩下的点是否在这两条线上,更新最大值就行了。。感觉要是放在以前我就做出来了,太久没做题手生,还是要多练

代码:

#include<stdio.h>
int main()
{
    int x[55],y[55],n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&x[i]); 
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",&y[i]);
    }
    int maxx=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i==j)
                continue;
            for(int k=0;k<n;k++)
            {
                if(i==k||j==k)
                    continue;
                if((y[k]-y[j])*(x[i]-x[j])!=(y[i]-y[j])*(x[k]-x[j]))
                {
                    int nums=3;
                    for(int l=0;l<n;l++)
                    {
                        if(i==l||j==l||k==l)
                            continue;
                        if((y[i]-y[l])*(x[i]-x[j])==(y[i]-y[j])*(x[i]-x[l]))
                        {
                            nums++;
                        }
                        else if((y[j]-y[i])*(y[k]-y[l])==(x[k]-x[l])*(x[i]-x[j]))
                        {
                            nums++;
                        }
                    }
                    if(nums>maxx)
                        maxx=nums;
                }
            }
        }
    }
    if(maxx==0)
        maxx=n;
    printf("%d\n",maxx);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37497322/article/details/82592509
今日推荐