题目地址
题干
代码和解释
解本题时使用了刚学的STL vector,注意hdu不支持万能头文件#include<bits/stdc++.h>
,所以要记得使用#include<vector>
。
这里是c++代码。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n,m;
int i,j;
int pos;
vector<int> start;
while(~scanf("%d%d",&n,&m)){
start.clear();
//初始化
for(i=0;i<2*n;i++){
start.push_back(i);
/*数组每个元素存储自己的位置,
这样即使删掉了元素后,Good guy的初始位置这个信息还能保留*/
}
pos = 0;
//删除坏人
for(i=0;i<n;i++){//一共n个坏人
pos=(pos+m-1)%start.size();
//因为是环形的,所以位置取模
//因为把本身当做1来数,数到第m个,所以要减去1
//2printf("%d
",pos);
start.erase(start.begin()+pos);
}
j=0;
//输出结果
for(i=0;i<2*n;i++){
if(i==start[j]&&j<n){
//注意这里一定要写&&j<n,因为这个问题一直wa。
//因为start的size已经为n了,当j超出这个size后必然会出错
//start里存储了Good guy的位置,共n个Good guy
printf("G");
j++;
}
else{
printf("B");
}
if(i!=0&&(i+1)%50==0){
//一行有50个字母
//注意这里不能写成i%49==0,不然差的越来越多
printf("
");
}
}
//相邻数据间留1空行
if(n%50!=0){
printf("
");
}
printf("
");
}
return 0;
}
}
本题的两个思考点是:
1.环形桌子,到末尾又回到开头。使用取模来实现。
2.如何在删除了坏人元素后保留好人位置的信息。一开始将位置信息存入数组中来实现。
本题的输出格式也比较苛刻,要注意换行的数量。
每行输出50个字母:
参考
功能 | 例子 | 说明 |
---|---|---|
定义int型数组 | vector |
默认初始化,a为空 |
vector |
用a定义b | |
vector |
a有100个值为0的元素 | |
vector |
100个值为6的元素 | |
定义string型数组 | vector |
100个值为6的元素 |
vector |
10个值为hello的元素 | |
vector |
b是a的复制 | |
定义结构型数组 | struct point{int x,y;} vector |
a用来存坐标 |
功能 | 例子 | 说明 |
---|---|---|
赋值 | a.push_back(100); | 在尾部添加元素 |
元素个数 | int size = a.size(); | 元素个数 |
是否为空 | bool isEmpty = a.empty(); | 判断是否为空 |
打印 | cout<<a[0]<<endl; | 打印第一个元素 |
中间插入 | a.insert(a.begin()+i,k); | 在第i个元素前面插入k |
尾部插入 | a.push_back(8); | 尾部插入值为8的元素 |
尾部插入 | a.insert(a.end(),10,5); | 尾部插入10个值为5的元素 |
删除尾部 | a.pop_back(); | 删除末尾元素 |
删除区间 | a.erase(a.begin()+i,a.begin()+j); | 删除区间[i,j-1]的元素 |
删除元素 | a.erase(a.begin()+2); | 删除第3个元素 |
调整大小 | a.resize(n) | 数组大小变为n |
清空 | a.clear(); | |
翻转 | reverse(a.begin(),a.end()); | 用函数reverse翻转数组 |
排序 | sort(a.begin(),a.end()); | 用函数sort排序,从小到大 |