hdu4939.throw nails
hdu4939.throw nails
【问题描述】
在团队队列中每个成员都属于一个团队,如果一个成员进入队列,它首先从头到尾搜索队列,以检查它的一些队友(同一队的成员)是否已经在队列中,如果是,它会进入到该团队的后面,如果不是,它会从尾部进入队列并成为新的最后一个成员。成员出队是按常规队列操作,按照出现在队列中的顺序从头到尾进行处理。你的任务是编写一个模拟这样的团队队列的程序。
【输入形式】
每个测试用例都以团队个数t开始(1≤t≤1000),然后是团队描述,每个描述包含属于团队的成员个数和成员编号列表,成员编号为0到999999之间的整数,一个团队最多可以包含1000个成员。然后是一系列命令,有三种不同的命令:
① ENQUEUE p:成员p进入队列。
② DEQUEUE:队列中第一个成员出来并将其从队列中删除。
③ STOP:当前测试用例结束。
【输出形式】
对于每个DEQUEUE命令,以单独一行输出出队的成员。
【样例输入】
2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
DEQUEUE
STOP
【样例输出】
101
102
103
201
202
203
Solution
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
int sumDistance(vector<int>vec,int sec){//用来计算第sec秒时该选手跑了多少米
int x=vec[0];
int y=vec[1];
int sum=x+(sec-1)*y;
return sum;
}
//用于将当前踩到钉子的选手“抹除”,方法是把其F、S都变成0,是而不可能参与到temp的比较中
void erasevec(vector<int>&vec){//记得引用传参
vec[0]=0;
vec[1]=0;
}
int main(){
ifstream infile("in.txt");
int N;infile>>N;
vector<vector<int>>vec(N);//vector二维数组
for(int x=0;x<N;x++){
int i;infile>>i;
int j;infile>>j;
vector<int>subvec(2);
subvec[0]=i;
subvec[1]=j;
vec[x]=subvec;
}
int n=1;
while (n<=N)
{
int temp=0;int flag=0;
for(int i=0;i<vec.size();i++){//遍历总向量vec,选出第n秒跑得最快的选手
int sum=sumDistance(vec[i],n);
if(sum>temp){//因为这里的条件设置的是“>”,所以不用担心并列情况
temp=sumDistance(vec[i],n);
flag=i;//标记最快的选手的序号
}
}
cout<<flag+1<<" ";
erasevec(vec[flag]);
n++;
}
return 0;
}
细节
如果vec是一个以
vector<vector<int>>vec
命名的二维数组,那么好像不能用vec.push_back(subVec)
来添加其子向量(出现了运行时错误)记得引用传参!!
This post is licensed under CC BY 4.0 by the author.