求指导马蜂
  • 板块灌水区
  • 楼主BK小鹿
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/10/31 22:48
  • 上次更新2024/11/1 14:30:57
查看原帖
求指导马蜂
1345783
BK小鹿楼主2024/10/31 22:48

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;
}
2024/10/31 22:48
加载中...