阿姆斯特朗回旋加速喷气式阿姆斯特朗炮(~~~~(>_<)~~~~)

题目来源: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("\n");
92     }
93 }

 

 

作者: 伊甸一点

本文版权归作者伊甸一点和博客园所有,欢迎转载和商用(须保留此段声明),且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.