• 阿姆斯特朗回旋加速喷气式阿姆斯特朗炮


    题目来源:https://biancheng.love/contest-ng/index.html#/34/problems

    题目描述

    时代在进步,在Nova君的改进下,阿姆斯特朗回旋加速喷气式阿姆斯特朗炮终于进化成为了先进的电磁轨道炮,不仅能够在直筒中发射直线型电磁炮,还能利用正负极磁场,在两座炮台间形成弧形电磁炮,大大加强了御敌能力。某一天,天人(外星人)入侵了地球,现在要用阿姆斯特朗回旋加速喷气式阿姆斯特朗炮进行轰击,简化图如下: ![] (http://ww1.sinaimg.cn/mw690/006jMFyngw1eyupfrs57wj30kg0drgm3.jpg)

    现在抽象问题,假设外星人都在X轴上方(不含X轴本身)出现,现在有三门阿姆斯特朗回旋加速喷气式阿姆斯特朗炮,中间的A炮,可以发射以原点O为起点的任意射线的电磁炮,其方向向量和X轴正方向夹角为Θ,可以消灭位于射线的所有敌人,位于两翼的炮B和炮C形成电磁回路,两炮口间有半圆形的弧形电磁炮,可以消灭位于弧形线上的所有敌人,设半圆的半径为R。每当发现敌人,A炮可以计算出敌人与O点连线和X轴正方向的夹角Θi,B炮和C炮可以计算出敌人所处弧形炮的半径Ri。现在有N个敌人,至少需要发射几次炮弹才能清理所有的外星人?(B、C联动只算发射一次)

    PS:

    (1) 假设Θi为角度制,范围1~179(单位:度)

    (2) 假设敌人出现的最大半径为1000

    输入

    多组测试数据(组数不超过10),对于每组数据,输入N+1行,第一行输入一个正整数N,代表外星人的个数。接下来的N行,每行输入两个正整数,为对应的A炮计算出的Θi 和 B、C炮计算出的Ri。

    输出

    对于每组数据,输出一行,代表发射的最少次数。

    输入样例

    3
    1 2
    2 2
    3 4
    

    输出样例

    2

    代码:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<list>
     4 #include<algorithm>
     5 #include<cstring>
     6 #include<string>
     7 #include<queue>
     8 #include<stack>
     9 #include<map>
    10 #include<vector>
    11 #include<cmath>
    12 #include<memory.h>
    13 #include<set>
    14 
    15 long long TNF=99999999;
    16 #define LL __int64
    17 #define eps 1e-8
    18 
    19 
    20 using namespace std;
    21 
    22 #define M 400000100
    23 
    24 #define inf 0xfffffff
    25 
    26 
    27 vector<int>G[1212];
    28 
    29 char tempmp[1212];
    30 int mp[1212][1212];
    31 int lmarry[1212],rmarry[1212];
    32 bool visl[1212],visr[1212];
    33 
    34 int dis[2][4]={0,-1,0,1,1,0,-1,0};
    35 
    36 int n=1000,m=1000,k;
    37 
    38 void clear()
    39 {
    40     memset(lmarry,-1,sizeof(lmarry));
    41     memset(rmarry,-1,sizeof(rmarry));
    42     memset(visl,false,sizeof(visl));
    43     memset(visr,false,sizeof(visr));
    44     memset(mp,0,sizeof(mp));
    45     for(int i=0;i<1212;i++)
    46         G[i].clear();
    47 }
    48 
    49 bool dfs(int x)
    50 {
    51     visl[x]=true;
    52     for(int i=0;i<G[x].size();i++)
    53     {
    54         int v=G[x][i];
    55         if(!visr[v])
    56         {
    57             visr[v]=true;
    58             if(lmarry[v]==-1 || dfs(lmarry[v]))
    59             {
    60                 lmarry[v]=x;
    61                 rmarry[x]=v;
    62                 return 1;
    63             }
    64         }
    65     }
    66     return 0;
    67 }
    68 
    69 
    70 int main(void)
    71 {
    72     while(~scanf("%d",&k))
    73     {
    74         clear();
    75         int u,v;
    76         for(int i=0;i<k;i++)
    77         {
    78             scanf("%d %d",&u,&v);
    79             G[u].push_back(v);
    80         }
    81         int ans=0;
    82         for(int i=1;i<=n;i++)
    83         {
    84             memset(visr,false,sizeof(visr));
    85             if(dfs(i))
    86                 ans++;
    87         }
    88         printf("%d",ans);
    89         memset(visl,false,sizeof(visl));
    90         memset(visr,false,sizeof(visr));
    91         printf("
    ");
    92     }
    93 }
     
  • 相关阅读:
    C语言输出颜色
    嵌入式Linux串口编程简介
    推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求
    嵌入式串口打印信息重定向到当前终端界面
    C、C++、boost、Qt在嵌入式系统开发中的使用
    LInux下Posix的传统线程示例
    Linux用C语言模拟‘ls‘命令
    关于Linux目录访问函数总结
    Inter内部指令--AVX编程基础
    SPECCPU2006测试(456测试小记)
  • 原文地址:https://www.cnblogs.com/zpfbuaa/p/5037565.html
Copyright © 2020-2023  润新知