1.小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3...bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 using namespace std; 5 const int N=100000; 6 int a[N]; 715 int maxcommon(int a,int b)//辗转法求最大公约数 16 { 17 18 int p=0; 19 while(a%b) 20 { 21 p=a%b; 22 a=b; 23 b=p; 24 } 25 return b; 26 } 27 28 int main() 29 { 30 int n; 31 while(cin>>n) 32 { 33 long long ca; 34 cin>>ca; 35 for(int i=0;i<n;i++) 36 { 37 scanf("%d",&a[i]); 38 } 39 for(int i=0;i<n;i++) 40 { 41 if(a[i]<=ca) 42 ca+=a[i]; 43 else 44 ca+=maxcommon(ca,a[i]); 45 } 46 cout<<ca<<endl; 47 } 48 } 49
2.兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那 就是黑默丁格------约德尔人历史上最伟大的科学家. 提莫说,黑默丁格最近在思考一个问题:黑默丁格有三个炮台,炮台能攻击到距离它R的敌人 (两点之间的距离为两点连续的距离,例如(3,0),(0,4)之间的距离是5),如果一个炮台能攻击 到敌人,那么就会对敌人造成1×的伤害.黑默丁格将三个炮台放在N*M方格中的点上,并且给出敌人 的坐标. 问:那么敌人受到伤害会是多大?
1 #include<iostream> 2 #include<math.h> 3 using namespace std; 4 int main() 5 { 6 int R,x1,y1,x2,y2,x3,y3,x0,y0; 7 while(cin>>R) 8 { 9 cin>>x1>>y1>>x2>>y2>>x3>>y3>>x0>>y0; 10 double dist1=sqrt((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)); 11 double dist2=sqrt((x2-x0)*(x2-x0)+(y2-y0)*(y2-y0)); 12 double dist3=sqrt((x3-x0)*(x3-x0)+(y3-y0)*(y3-y0)); 13 int count=0; 14 if(dist1<(double)R) 15 count++; 16 if(dist2<(double)R) 17 count++; 18 if(dist3<(double)R) 19 count++; 20 cout<<count<<"x"<<endl; 21 } 22 } 23 添加笔记
3.在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇?
注意:每个方格被扫描一次只能清除掉一个蘑菇。
1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 void findmax(vector<vector<int>>field,int N,int M,vector<int>&res) 5 { 6 for(int i=0;i<N-2;i++) 7 { 8 for(int j=0;j<M-2;j++) 9 { 10 int tmp=0; 11 for(int m=i;m<=i+2;m++)//以field[i][j]为起始点向左三个,向右三个的方块区域内最大能消灭的蘑菇数 12 { 13 for(int n=j;n<=j+2;n++) 14 { 15 if(field[m][n]>0) 16 { 17 tmp++; 18 } 19 } 20 } 21 if(res[0]<tmp) 22 { 23 res[0]=tmp; 24 res[1]=i; 25 res[2]=j; 26 } 27 28 } 29 } 30 31 } 32 int main() 33 { 34 int N,M,K; 35 int x,y; 36 while(cin>>N>>M>>K) 37 { 38 if(N<3) 39 N=3; 40 if(M<3) 41 M=3; 42 vector<vector<int>>field(N,vector<int>(M,0)); 43 while(K--) 44 { 45 cin>>x>>y; 46 field[x-1][y-1]++; 47 } 48 vector<int>first(3,0); 49 vector<int>second(3,0); 50 findmax(field,N,M,first); 51 for(int i=first[1];i<first[1]+3;i++)//第二次查找之前要把之前消灭的从field中去除 52 { 53 for(int j=first[2];j<first[2]+3;j++) 54 field[i][j]--; 55 } 56 findmax(field,N,M,second); 57 cout<<first[0]+second[0]<<endl; 58 59 } 60 }