小易的升级之路
小易经常沉迷于网络游戏.有一次,他在玩一个打怪升级的游戏,他的角色的初始能力值为 a.在接下来的一段时间内,他将会依次遇见n个怪物,每个怪物的防御力为b1,b2,b3…bn. 如果遇到的怪物防御力bi小于等于小易的当前能力值c,那么他就能轻松打败怪物,并 且使得自己的能力值增加bi;如果bi大于c,那他也能打败怪物,但他的能力值只能增加bi 与c的最大公约数.那么问题来了,在一系列的锻炼后,小易的最终能力值为多少?
#include <iostream>
#include <vector>
using namespace std;
int getMaxNum(int a,int b){//辗转相除
if(a<b) swap(a,b);
int c;
while(b){//结束条件
c=a%b;
a=b;
b=c;
}
return a;
}
int getEndofB(vector<int> &b,int &n,int a){
for(int i=0;i<n;++i){
if(b[i]<=a){
a+=b[i];
}
else{
a+=getMaxNum(b[i],a);
}
}
return a;
}
int main(){
int n,a;
while(cin>>n>>a){//测试数据格式
vector<int> b(n);
for(int i=0;i<n;++i){
int bi;
cin>>bi;
b[i]=bi;
}
cout<<getEndofB(b,n,a)<<endl;
}
return 0;
}
炮台攻击
兰博教训提莫之后,然后和提莫讨论起约德尔人,谈起约德尔人,自然少不了一个人,那 就是黑默丁格——约德尔人历史上最伟大的科学家. 提莫说,黑默丁格最近在思考一个问题:黑默丁格有三个炮台,炮台能攻击到距离它R的敌人 (两点之间的距离为两点连续的距离,例如(3,0),(0,4)之间的距离是5),如果一个炮台能攻击 到敌人,那么就会对敌人造成1×的伤害.黑默丁格将三个炮台放在N*M方格中的点上,并且给出敌人 的坐标. 问:那么敌人受到伤害会是多大?
#include <iostream>
using namespace std;
int getMaxHurt(int &r,int &x1,int &y1,int &x2,int &y2,int &x3,int &y3,int &x0,int &y0){
int i=0;
r*=r;
if(r>=(x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)) ++i;
if(r>=(x2-x0)*(x2-x0)+(y2-y0)*(y2-y0)) ++i;
if(r>=(x3-x0)*(x3-x0)+(y3-y0)*(y3-y0)) ++i;
return i;
}
int main(){
int r,x1,y1,x2,y2,x3,y3,x0,y0;
while(cin>>r>>x1>>y1>>x2>>y2>>x3>>y3>>x0>>y0){
cout<<getMaxHurt(r,x1,y1,x2,y2,x3,y3,x0,y0)<<"x"<<endl;
}
return 0;
}
扫描透镜
在N*M的草地上,提莫种了K个蘑菇,蘑菇爆炸的威力极大,兰博不想贸然去闯,而且蘑菇是隐形的.只 有一种叫做扫描透镜的物品可以扫描出隐形的蘑菇,于是他回了一趟战争学院,买了2个扫描透镜,一个 扫描透镜可以扫描出(3*3)方格中所有的蘑菇,然后兰博就可以清理掉一些隐形的蘑菇. 问:兰博最多可以清理多少个蘑菇?
注意:每个方格被扫描一次只能清除掉一个蘑菇。
前两题很容易,这一题其实也比较好做,就是题目不容易读懂,测试修改很久,才AC,仍旧对题意不甚理解。
1、对坐标数据传入 cin>>v0[0]>>v0[1];v[i]=(v0);就好了,不要错误的加在while中,这样会导致数据错误。
2、对于第一次扫描,我们很容易得到结果。但是第二次该怎么做呢。
3、第二次:将已经清除掉的蘑菇-1,然后再按照第一次寻找3*3最大的方式,在个数大于0的前提下找出最多蘑菇数。
4、相加返回。
注意点,由于容器比较混杂,可能会有迭代器对应错误情况,需要仔细审查。
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int canClean(int n,int m,int k,vector<vector<int>> v){
vector<map<vector<int>,int>> vsv;
for(int j=1;j<=m;++j){
for(int i=1;i<=n;++i){
map<vector<int>,int> mv;
for(const vector<int> v0:v){
if(v0[0]>=i&&v0[0]<=i+2&&v0[1]>=j&&v0[1]<=j+2){
++mv[v0];
}
}
vsv.push_back(mv);
}
}
vector<map<vector<int>,int>>::iterator maxiter=vsv.begin();
int maxsz=0;
for(const auto &mvi:(*maxiter)){
++maxsz;
}
for(auto iter=vsv.begin();iter!=vsv.end();++iter){
int sz=0;
for(const auto &mvi:(*iter)){
++sz;
}
if(sz>maxsz){
maxsz=sz;
maxiter=iter;
}
}
map<vector<int>,int>::iterator p;
for(auto &mp:(*maxiter)){
for(auto iter=vsv.begin();iter!=vsv.end();++iter){
if((p=iter->find(mp.first))!=iter->end())
--p->second;
}
}
vector<map<vector<int>,int>>::iterator maxiter1;
int maxsz1=0;
for(auto iter=vsv.begin();iter!=vsv.end();++iter){
int sz=0;
for(const auto &mvi:(*iter)){
if(mvi.second>0) ++sz;
}
if(sz>maxsz1){
maxsz1=sz;
maxiter1=iter;
}
}
return maxsz+maxsz1;
}
int main(){
int n,m,k;
while(cin>>n>>m>>k){
vector<vector<int>> v(k);
vector<int> v0(2);
for(int i=0;i<k;++i){
cin>>v0[0]>>v0[1];
v[i]=(v0);
}
cout<<canClean(n,m,k,v)<<endl;
}
return 0;
}