2. Oliver的成绩
题目ID:1412必做题100分
最新提交:
Time Limit Exceeded
60 分
历史最高:
Time Limit Exceeded
60 分
时间限制: 1000ms
空间限制: 65536kB
题目描述
题目描述
Oliver 进入初中后,觉得自己不能总是玩儿了,应该要好好学习了。正好一次考试结束了,Oliver 想知道自己的语文、数学、英语分别与语文年级第一、数学年级第一、英语年级第一相差多少。
由于 Oliver 所在年级有 NN 个人,非常多,所以 Oliver 想你编个程序帮帮他。
输入格式
输入数据共 3N+43N+4 行:
- 第 1 行:Oliver 的语文成绩(整数,位数为 M)。
- 第 2 行:Oliver 的数学成绩(整数,位数为 M)。
- 第 3 行:Oliver 的英语成绩(整数,位数为 M)。
- 第 4 行:一个整数 N,表示年级中的学生人数。
- 接下来 3N3N 行,每 3 行一组,分别代表每个学生的语文、数学、英语成绩(均为整数,位数为 M)。
输出格式
输出 Oliver 的语文、数学、英语成绩与年级各科最高分的差距(差值为正数表示 Oliver 成绩低于最高分,差值为 0 表示 Oliver 已经是最高分)。
样例数据
样例输入
10 10 10 3 0 80 0 40 0 0 0 0 100
样例输出
30 70 90
数据范围
0<N≤100000<N≤10000,0<M≤10000<M≤1000
P堡本人的代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n;
string a[10010][4], b[4];
void init() {
for (int i = 1; i <= 3; i++)
cin >> b[i];
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= 3; j++)
cin >> a[i][j];
++n;
for (int i = 1; i <= 3; i++)
a[n][i] = b[i];
}
bool pd(string x, string y) {
int lx = x.size(), ly = y.size();
if(lx > ly) return 1;
else if(lx < ly) return 0;
else {
char i[110], j[110];
x.copy(i, x.npos, 0);
strcpy(i, x.c_str());
y.copy(j, y.npos, 0);
strcpy(j, y.c_str());
if(strcmp(i, j) >= 0) return 1;
else return 0;
}
}
void myswap() {
for(int k = 1; k <= 3; k++)
for (int i = 1; i <= n - 1; i++) {
bool flag = false;
for (int j = 1; j <= n - i; j++) {
if (pd(a[j][k] , a[j + 1][k])) {
swap(a[j][k], a[j + 1][k]);
flag = true;
}
}
if (!flag) {
break;
}
}
}
bool cmpstr(string f, string h) {
return f.size() < h.size() || (f.size() == h.size() && f < h);
}
string jian(string a, string b) {
string ans;
int x[N], y[N], c[N], lena, lenb, lenc, d;
ans = "";
memset(x, 0, sizeof(x));
memset(y, 0, sizeof(y));
memset(c, 0, sizeof(c));
if (a == b) {
return "0";
}
if (cmpstr(a, b)) {
ans = "-";
swap(a, b);
}
lena = a.size(), lenb = b.size(), lenc = lena;
for (int i = 0; i < lena; i++) {
x[lena - i] = a[i] - '0';
}
for (int i = 0; i < lenb; i++) {
y[lenb - i] = b[i] - '0';
}
for (int i = 1; i <= lenc; i++) {
c[i] += x[i] - y[i];
if (c[i] < 0) {
c[i + 1]--, c[i] += 10;
}
}
while (lenc > 1 && c[lenc] == 0) {
lenc--;
}
for (int i = lenc; i > 0; i--) {
ans += c[i] + '0';
}
return ans;
}
void js() {
for (int i = 1; i <= 3; i++)
b[i] = jian(a[n][i], b[i]);
}
void print() {
for (int i = 1; i <= 3; i++)
cout << b[i] << ' ';
printf("\n");
}
int main() {
init();
myswap();
js();
print();
return 0;
}