P堡求助————求时间优化

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;
}

@金杭东 回老帖