找成绩差距
描述
小慧进入初中后,觉得自己不能总是玩了,应该要好好学习了。正好一次考试结束,小慧想知道自己的语文、数学、英语成绩分别与语文年级第一、数学年级第一、英语年级第一的相差多少。
由于小慧所在年级有N个人,所以小慧想请你编个程序帮帮他。
输入
共3N+4行,第1至第3行分别为小慧的语文、数学、英语成绩(位数M),第4行为N,以下3N行,每行一个数(它们的位数是M),分别为第N个同学的语文、数学、英语成绩。
即:小慧的语文
数学
英语
N
第一个人的语文
数学
英语
第二个人的语文
……
输出
共1行,有三个数,分别为小慧的语文、数学、英语成绩与年级第一的差。
如果小慧是第一,则输出0。
输入样例 1
10 10 10 3 0 80 0 40 0 0 0 0 100
输出样例 1
30 70 90
提示
【数据规模】
对于50%的数据,0<N<1000, 0<M<19;
对于100%的数据,0<N<10000, 0<M<30,且都为整数。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
bool cmp (vector<int> &A, vector<int> &B) {
if (A.size()!=B.size()) return A.size()>B.size();
for (int i = A.size()-1; i >= 0; i--) {
if (A[i] != B[i]) return A[i]>B[i];
}
return 1;
}
vector<int> sub(vector<int> &A, vector<int> &B) {
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i++) {
t = A[i] - t;
if (i < B.size()) t -= B[i];
C.push_back((t + 10) % 10);
if (t < 0) t = 1;
else t = 0;
}
while (C.size()>1 && C.back()==0) C.pop_back();
return C;
}
int main () {
vector<int> x, y, z, ch, ma, en;
string X, Y, Z;
cin>>X>>Y>>Z;
for (int i = X.size()-1; i >= 0; i--) x.push_back(X[i] - '0');
for (int i = Y.size()-1; i >= 0; i--) y.push_back(Y[i] - '0');
for (int i = Z.size()-1; i >= 0; i--) z.push_back(Z[i] - '0');
int n;
cin>>n;
while (n--) {
string A, B, C;
cin>>A>>B>>C;
vector<int> a, b, c;
for (int i = A.size()-1; i >= 0; i--) a.push_back(A[i] - '0');
for (int i = B.size()-1; i >= 0; i--) b.push_back(B[i] - '0');
for (int i = C.size()-1; i >= 0; i--) c.push_back(C[i] - '0');
if (cmp(a, ch)) {
ch = a;
}
if (cmp(b, ma)) {
ma = b;
}
if (cmp(c, en)) {
en = c;
}
}
if (cmp(ch, x)) {
vector<int> a1 = sub(ch, x);
for (int i = a1.size()-1; i>=0; i--) printf("%d", a1[i]);
} else printf("0");
printf(" ");
if (cmp(ma, y)) {
vector<int> a2 = sub(ma, y);
for (int i = a2.size()-1; i>=0; i--) printf("%d", a2[i]);
} else printf("0");
printf(" ");
if (cmp(en, z)) {
vector<int> a3 = sub(en, z);
for (int i = a3.size()-1; i>=0; i--) printf("%d", a3[i]);
} else printf("0");
return 0;
}