一样写的二进制T俩点,求求大佬帮帮
  • 板块P1833 樱花
  • 楼主Donald_Ducka
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/11 20:41
  • 上次更新2024/3/11 22:22:34
查看原帖
一样写的二进制T俩点,求求大佬帮帮
94772
Donald_Ducka楼主2024/3/11 20:41
#include <bits/stdc++.h>
using namespace std;

struct good {
	int v, w;
};
good h[100001];
int f[10001];

int time(string s) {
	int len = s.size();
	int ans = 0;
	if (s[1] == ':') {
		ans += (s[0] + '0') * 60 + (s[2] + '0') * 10 + (s[3] + '0');
	} else {
		ans += (s[0] + '0') * 600 + (s[1] + '0') * 60 + (s[3] + '0') * 10 + (s[4] + '0');
	}
	return ans;
}

int main() {
	string s1, s2;
	cin >> s1 >> s2;
	int T = time(s2) - time(s1);
	int n;
	cin >> n;
	int t = 0;
	for (int i = 1; i <= n; i++) {
		int v1, w1, p;
		cin >> v1 >> w1 >> p;
		if (p == 0) {
			int s = T / v1;
			for (int j = 1; s >= j; j *= 2) {
				h[++t].v = j * v1;
				h[t].w = j * w1;
				s -= j;
			}
			if (s) {
				h[++t].v = s * v1;
				h[t].w = s * w1;
			}
		} else if (p == 1) {
			h[++t].v = v1;
			h[t].w = w1;
		} else {
			int s = p;
			for (int j = 1; s >= j; j *= 2) {
				h[++t].v = j * v1;
				h[t].w = j * w1;
				s -= j;
			}
			if (s) {
				h[++t].v = s * v1;
				h[t].w = s * w1;
			}
		}
	}
	for (int i = 1; i <= t; i++) {
		for (int j = T; j >= h[i].v; j--) {
			f[j] = max(f[j], f[j - h[i].v] + h[i].w);
		}
	}

	cout << f[T];
}
2024/3/11 20:41
加载中...