是我脑子有坑还是数据有锅啊()
  • 板块P1156 垃圾陷阱
  • 楼主_Felix
  • 当前回复11
  • 已保存回复11
  • 发布时间2021/10/21 11:33
  • 上次更新2023/11/4 03:05:12
查看原帖
是我脑子有坑还是数据有锅啊()
106738
_Felix楼主2021/10/21 11:33

63pts:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mkp make_pair
#define pb push_back
#define PII pair<int, int>
#define PLL pair<ll, ll>
const int inf = 0x3f3f3f3f;
int D, G, f[110][150];
struct node {
	int T, F, h;
	bool operator < (const node x) const {
		return T < x.T;
	}
}rb[110];
int main(){
	scanf("%d%d", &D, &G);
	for(int i = 1; i <= G; i++) 
		scanf("%d%d%d", &rb[i].T, &rb[i].F, &rb[i].h);
	sort(rb + 1, rb + G + 1);
	for(int i = 0; i <= G; i++)
		for(int j = D + rb[i].h; j >= 0; j--)
			f[i][j] = -inf;
	f[0][0] = 10;
	int ans = -1, res = 10;
	for(int i = 1; i <= G; i++) {
		for(int j = D + rb[i].h; j >= 0; j--) {
			if(j >= rb[i].h && f[i - 1][j - rb[i].h] >= rb[i].T - rb[i - 1].T)
				f[i][j] = max(f[i][j], f[i - 1][j - rb[i].h] - (rb[i].T - rb[i - 1].T));
			if(f[i - 1][j] >= rb[i].T - rb[i - 1].T)
				 f[i][j] = max(f[i][j], f[i - 1][j] - (rb[i].T - rb[i - 1].T) + rb[i].F);
			//cout<<j<<" "<<D<<" "<<f[i][j]<<endl;
			if(j >= D && f[i][j] != -inf) {
			//	cout<<i<<"*"<<j<<endl;
				ans = rb[i].T; break;
			}
			if(f[i][j] != -inf) res = max(res, rb[i].T + f[i][j]);
		}
		if(ans != -1) break;
	}
	if(ans == -1) printf("%d\n", res);
	else printf("%d\n", ans);
	return 0;
}
/*
1000 1
1 1000000000 1
*/

100pts:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mkp make_pair
#define pb push_back
#define PII pair<int, int>
#define PLL pair<ll, ll>
const int inf = 0x3f3f3f3f;
int D, G, f[110][150];
struct node {
	int T, F, h;
	bool operator < (const node x) const {
		return T < x.T;
	}
}rb[110];
int main(){
	scanf("%d%d", &D, &G);
	for(int i = 1; i <= G; i++) 
		scanf("%d%d%d", &rb[i].T, &rb[i].F, &rb[i].h);
	sort(rb + 1, rb + G + 1);
	for(int i = 0; i <= G; i++)
		for(int j = D + rb[i].h; j >= 0; j--)
			f[i][j] = -inf;
	f[0][0] = 10;
	int ans = -1, res = 10;
	for(int i = 1; i <= G; i++) {
		for(int j = D + rb[i].h; j >= 0; j--) {
			if(j >= rb[i].h && f[i - 1][j - rb[i].h] >= rb[i].T)
				f[i][j] = max(f[i][j], f[i - 1][j - rb[i].h]);
			if(f[i - 1][j] >= rb[i].T)
				 f[i][j] = max(f[i][j], f[i - 1][j] + rb[i].F);
			if(j >= D && f[i][j] != -inf) {
				ans = rb[i].T; break;
			}
			if(f[i][j] != -inf) res = max(res, f[i][j]);
		}
		if(ans != -1) break;
	}
	if(ans == -1) printf("%d\n", res);
	else printf("%d\n", ans);
	return 0;
}
/*
1000 1
1 1000000000 1
*/

对比可以发现,只是在dp的过程中有没有直接减去 rb[i].T - rb[i - 1].T

我:????

2021/10/21 11:33
加载中...