64分求调
查看原帖
64分求调
37040
Vorest楼主2024/3/10 19:17

RT 后面样例WA

码风不太好,见谅

#include <bits/stdc++.h>
using namespace std;
long long a[300005], st[1001], d[1001], m[1001];
long long n, d1, d2, ds;
long long t;
long long mx, k, date, month, kk, i, j, q, p;

long long countdigit(long long a1) {
	p = 0;
	while (a1 != 0) {
		a1 /= 10;
		p++;
	}
	return p;
}

void division(long long s) {
	p = 1;
	while (s != 0) {
		st[p] = s % 10;
		s /= 10;
		p++;
	}
}

void dmsort(long long cnt) {
	long long minn;
	for (i = 1; i <= cnt; i++) {
		minn = i;
		for (j = i + 1; j <= cnt; j++) {
			if (m[j] < m[minn]) {
				minn = j;
			} else if (m[j] == m[minn]) {
				if (d[j] < m[minn]) {
					minn = j;
				}
			}
		}
		swap(m[i], m[minn]);
		swap(d[i], d[minn]);
	}
}

int main() {
	cin >> t;
	for (kk = 1; kk <= t; kk++) {
		cin >> n >> k;
		long long ans = 0;
		memset(m, 0, sizeof m);
		memset(d, 0, sizeof d);
		d1 = countdigit(n); //月最长数位
		d2 = 0; //日最长数位
		for (i = 1; i <= n; i++) {
			cin >> a[i];
			d2 = max(d2, countdigit(a[i]));
		}
		ds = d2 + d1;
		if (k != 1) {
			for (q = k; q <= pow(10, ds + 1); q *= k) {
				date = 0, month = 0;
				memset(st, 0, sizeof st);
				mx = countdigit(q);
				division(q);
				for (j = 1; j <= min(d1, mx); j++) { //枚举
					date = 0, month = 0;
					for (i = mx; i > mx - j; i--) {
						month = month * 10 + st[i];
					}
					if (st[mx - j] == 0)
						continue;
					for (i = mx - j; i >= 1; i--) {
						date = date * 10 + st[i];
					}
					if (month <= n) {
						if (date <= a[month] && date >= 1) {
							ans++;
							d[ans] = date;
							m[ans] = month;
						}
					}
				}
			}
			if (!ans)
				cout << 0 << endl;
			else {
				cout << ans << endl;
				dmsort(ans);
				for (i = 1; i <= ans; i++) {
					cout << m[i] << " " << d[i] << endl;
				}
			}
		} else
			cout << "0" << endl;
	}
	return 0;
}
2024/3/10 19:17
加载中...