Think:
1知识点:队列+模拟
2反思:
1、心态反思:实训结束不久,心态松懈,基础知识方面多次犯错,分析问题不深入、不全面
2、知识点反思:基础知识不牢固,关于运算符优先级方面知识需要提高
运算符优先级——百度百科
3、错误反思:不同时刻窗口的人数不一定相等
3题目分析:双队列模拟银行的双窗口,注意平均逗留时间的计算
以下为Wrong Answer代码——不同时刻窗口的人数不一定相等
#include <bits/stdc++.h>
using namespace std;
struct node {
int Begin;
int End;
}link_1, link_2;
int tp1, tp2;
int main(){
int T, n, i, x, y;
scanf("%d", &T);
while(T--){
scanf("%d", &n);
double sum = 0;
tp1 = tp2 = 0;
link_1.Begin = link_1.End = 0;
link_2.Begin = link_2.End = 0;
for(i = 0; i < n; i++){
scanf("%d %d", &x, &y);
if(x < 0 || x > 360){
continue;
}
if(tp1 <= tp2){
if(tp1 == 0){
link_1.Begin = x;
link_1.End = x + y;
}
else {
if(x >= link_1.End){
sum += (double)(link_1.End - link_1.Begin);
link_1.Begin = x;
link_1.End = x + y;
}
else {
sum += (double)(link_1.End - link_1.Begin);
sum += (double)(link_1.End - x);
link_1.Begin = link_1.End;
link_1.End += y;
}
tp1--;
}
tp1++;
}
else {
if(tp2 == 0){
link_2.Begin = x;
link_2.End = x + y;
}
else {
if(x >= link_2.End){
sum += (double)(link_2.End - link_2.Begin);
link_2.Begin = x;
link_2.End = x + y;
}
else {
sum += (double)(link_2.End - link_2.Begin);
sum += (double)(link_2.End - x);
link_2.Begin = link_2.End;
link_2.End += y;
}
tp2--;
}
tp2++;
}
}
sum += (double)(link_1.End - link_1.Begin);
sum += (double)(link_2.End - link_2.Begin);
printf("%.2lf\n", sum/(n));
}
return 0;
}
/***************************************************
User name:
Result: Wrong Answer
Take time: 0ms
Take Memory: 224KB
Submit time: 2017-07-13 20:34:04
****************************************************/
以下为Accepted代码
#include <bits/stdc++.h>
using namespace std;
struct node {
int Begin;
int End;
}link_1[104], link_2[104];
int op1, op2, tp1, tp2;
int main(){
int T, n, i, x, y;
scanf("%d", &T);
while(T--){
op1 = op2 = tp1 = tp2 = 0;
double sum = 0;
memset(link_1, 0, sizeof(link_1));
memset(link_2, 0, sizeof(link_2));
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d %d", &x, &y);
while(op1 < tp1 && x >= link_1[op1].End){
op1++;
}
while(op2 < tp2 && x >= link_2[op2].End){
op2++;
}
if(op1 == tp1){
link_1[tp1].Begin = x;
link_1[tp1].End = x + y;
tp1++;
sum += (double)(y);
}
else if(op2 == tp2){
link_2[tp2].Begin = x;
link_2[tp2].End = x + y;
tp2++;
sum += (double)(y);
}
else if((tp1 - op1) <= (tp2 - op2)){
link_1[tp1].Begin = link_1[tp1-1].End;
link_1[tp1].End = link_1[tp1-1].End + y;
sum += (double)(link_1[tp1].End - x);
tp1++;
}
else if((tp1 - op1) > (tp2 - op2)){
link_2[tp2].Begin = link_2[tp2-1].End;
link_2[tp2].End = link_2[tp2-1].End + y;
sum += (double)(link_2[tp2].End - x);
tp2++;
}
}
printf("%.2lf\n", sum/n);
}
return 0;
}
/***************************************************
User name:
Result: Accepted
Take time: 0ms
Take Memory: 228KB
Submit time: 2017-07-13 21:15:51
****************************************************/