#include<iostream> usingnamespace std; #define MAXDATA 1000 typedefstruct { int row;//行 int col;//列 int num;//数值 }Node; struct { int maxRow;//最大行 int maxCol;//最大列 int noZero;//非零元素 Node data[MAXDATA];//数据域 }A,B,AB;//AB为A+B矩阵
int newZero;//A+B时产生的新0
voidadd()//计算A+B { int i =0, j = 0; AB.maxRow = A.maxRow; AB.maxCol = A.maxCol;//相加后行列不变 for (i = 0; i < A.noZero; i++) { AB.data[i] = A.data[i]; AB.noZero++; }//先把A拷贝给AB
for (i = 0; i < B.noZero; i++) { for (j = 0; j < AB.noZero; j++) { //行列一样直接加 if (B.data[i].row == AB.data[j].row && B.data[i].col == AB.data[j].col) { AB.data[j].num += B.data[i].num; if (AB.data[j].num == 0)newZero++; break; } } //行列不一样赋值再nozero+1 if (j == AB.noZero){ AB.data[AB.noZero] = B.data[i]; AB.noZero++; } } } voidswap(Node& a, Node& b) { Node c = a; a = b; b = c; }
//初始化矩阵 //输入矩阵的行和列数 cin >> A.maxRow >> A.maxCol >> A.noZero >> B.noZero; B.maxRow = A.maxRow; B.maxCol = A.maxCol; //填充数据 for (int i = 0; i < A.noZero; i++) cin >> A.data[i].row >> A.data[i].col >> A.data[i].num; for (int i = 0; i < B.noZero; i++) cin >> B.data[i].row >> B.data[i].col >> B.data[i].num; //相加运算 add(); sort(); printf("%d %d %d\n", AB.maxRow, AB.maxCol, AB.noZero-newZero); for (int i = 0; i < AB.noZero; i++) if(AB.data[i].num)//不为0再打印 printf("%d %d %d\n",AB.data[i].row, AB.data[i].col, AB.data[i].num);
}
栈
堆栈是一种经典的后进先出的线性结构,相关的操作主要有“入栈”(在堆栈顶插入一个元素)和“出栈”(将栈顶元素返回并从堆栈中删除)。本题要求你实现另一个附加的操作:“取中值”——即返回所有堆栈中元素键值的中值。给定 N 个元素,如果 N 是偶数,则中值定义为第 N/2 小元;若是奇数,则为第 (N+1)/2 小元。
//输入数据 cin >> n; init(); for (int i = 0; i < n; i++) { cin >> gue[i].arr >> gue[i].deal; gue[i].wait = 0; if (gue[i].deal > 60)gue[i].deal = 60;//最长处理时间为60 } cin >> k;
int cur = 0;//记录正在处理第几个客人 while (cur != n || inUse != 0) {//所有人都到,并且所有柜台为空,则停止计时 while (gue[cur].arr <= curTime && cur < n) {//当前时间来了的客人进队 push(cur);//排队 cur++; } for (int i = 0; i < k; i++)//遍历所有柜台,检查当前时间是否有客人处理完 if (curTime >= rec[i].leaveTime) { if (rec[i].leaveTime) { rec[i].leaveTime = 0; inUse--; } pop(i);//出队 } for (int i = 0; i < que.count; i++) (*que.q[(i + que.head) % n]).wait++;//等待时间增加 curTime++;//时间流动
} curTime--;//在这里减去多出来这一分钟
//输出结果 for (int i = 0; i < n; i++) { aveTime += gue[i].wait; if (maxTime < gue[i].wait)maxTime = gue[i].wait; } aveTime = aveTime / n; printf("%.1lf %d %d\n", aveTime, maxTime, curTime); for (int i = 0; i < k; i++)printf("%d ", rec[i].count); cout << endl; }