rt,最近想改一下,感觉没什么头绪,大佬们帮忙看看哪种更好:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5505;
int n;
int a[N], mo[15] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string s, s1;
bool ck(int Y) {
if ((Y % 100 != 0) && (Y % 4 == 0)) return 1;
if ((Y % 100 == 0) && (Y % 400 == 0)) return 1;
return 0;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i];
sort(a + 1, a + n + 1);
int cnt = 0, ans = 0;
cin >> s >> s1;
int year1, year2, month1, month2, day1, day2, Time1, Time2;
year1 = (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + (s[3] - '0');
year2 = (s1[0] - '0') * 1000 + (s1[1] - '0') * 100 + (s1[2] - '0') * 10 + (s1[3] - '0');
month1 = (s[5] - '0') * 10 + (s[6] - '0');
month2 = (s1[5] - '0') * 10 + (s1[6] - '0');
day1 = (s[8] - '0') * 10 + (s[9] - '0');
day2 = (s1[8] - '0') * 10 + (s1[9] - '0');
Time1 = (s[11] - '0') * 1000 + (s[12] - '0') * 100 + (s[14] - '0') * 10 + (s[15] - '0');
Time2 = (s1[11] - '0') * 1000 + (s1[12] - '0') * 100 + (s1[14] - '0') * 10 + (s1[15] - '0');
if (year1 == year2) {
if (ck(year1)) mo[2] ++ ;
if (month1 == month2) {
if (day1 == day2) {
if (Time1 / 100 == Time2 / 100) {
cnt += ((Time2 % 100) - (Time1 % 100));
}else {
cnt += (60 - (Time1 % 100));
int l = max((Time2 / 100) - 1 - (Time1 / 100), 0);
cnt += (l * 60);
cnt += (Time2 % 100);
}
}else {
cnt += (max(day2 - 1 - day1, 0) * 1440);
cnt += (60 - (Time1 % 100));
cnt += (max(24 - (Time1 / 100 + 1), 0)) * 60;
cnt += (Time2 / 100) * 60;
cnt += (Time2 % 100);
}
} else {
cnt += (max((60 - (Time1 % 100)), 0));
cnt += (max(24 - ((Time1 / 100) + 1), 0)) * 60;
cnt += (max(mo[month1] - day1, 0)) * 1440;
for (int i = month1 + 1; i < month2; i ++ ) {
cnt += mo[i] * 1440;
}
cnt += (Time2 / 100) * 60;
cnt += (Time2 % 100);
cnt += (max(day2 - 1, 0)) * 1440;
}
} else {
cnt += (60 - (Time1 % 100));
cnt += (max((24 - Time1 / 100), 0) * 60);
cnt += (max(mo[month1] - day1, 0)) * 1440;
for (int i = month1 + 1; i <= 12; i ++ ) {
if (i == 2 && ck(year1)) {
cnt += 1440;
}
cnt += mo[i] * 1440;
}
for (int i = year1 + 1; i < year2; i ++ ) {
for (int j = 1; j <= 12; j ++ ) {
if (ck(i) && j == 2) {
cnt += 1440;
}
cnt += (mo[j] * 1440);
}
}
cnt += (Time2 % 100);
cnt += (Time2 / 100) * 60;
for (int i = 1; i < day2; i ++ ) cnt += 1440;
for (int i = 1; i < min(month2, 12); i ++ ) {
if (ck(year2) && i == 2) {
cnt += 1440;
}
cnt += mo[i] * 1440;
}
}
int i = 1;
while (cnt > 0) {
if (cnt < a[i] || i > n) break;
cnt -= a[i ++ ];
ans ++ ;
}
cout << ans << '\n';
return 0;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
typedef long long LL;
const int N = 35, mod = 1e9 + 9;
int n, m, c4;
int g[15][N][N], f[15][N][N], c[N * N][N * N], a[N];
int res;
inline void init()
{
for (int i = 0; i < N * N; i ++ )
for (int j = 0; j <= i; j ++ )
if (!j) c[i][j] = 1;
else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
}
signed main()
{
init();
scanf("%lld%lld%lld", &n, &m, &c4);
f[0][0][0] = 1;
for (int i = 1; i <= c4; i ++ ) scanf("%lld", &a[i]);
for (int k = 1; k <= c4; k ++ )
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
{
if (i * j < a[k]) continue;
g[k][i][j] += (c[i * j][a[k]] % mod);
g[k][i][j] %= mod;
for (int l = 1; l <= i; l ++ )
for (int r = 1; r <= j; r ++ )
{
if (l == i && r == j) continue;
g[k][i][j] -= (((g[k][l][r] % mod) * (c[i][l] % mod) * (c[j][r] % mod) % mod) % mod);
g[k][i][j] %= mod;
}
}
for (int k = 1; k <= c4; k ++ )
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
for (int l = 0; l < i; l ++ )
for (int r = 0; r < j; r ++ )
{
if ((i - l) * (j - r) < a[k]) continue;
f[k][i][j] = (f[k][i][j] % mod + (f[k - 1][l][r] * g[k][i - l][j - r] % mod) * (c[n - l][i - l] * c[m - r][j - r] % mod)) % mod;
f[k][i][j] %= mod;
}
for (int i = 1; i <= n; i ++ )
for (int j = 1; j <= m; j ++ )
res += (f[c4][i][j] % mod), res %= mod;
printf("%lld\n", res);
return 0;
}