aaa , 帮忙看看吧~~~只过了第二个点
查看原帖
aaa , 帮忙看看吧~~~只过了第二个点
376452
colin_lord楼主2021/10/4 11:03
#include<bits/stdc++.h>

using namespace std;
const int N = 610 , INF = 1e9;
int h[N] , a[N] , b[N] , n , f[N][N];
vector<int> p;
int rd()
{
	int al = 0 , f = 1;char b = getchar();
	while(!isdigit(b)){if(b == '-') f = -1;b = getchar();}
	while(isdigit(b)){al = al * 10 + b - '0';b = getchar();}return al * f;
}

int main()
{
	int T;
	T = rd();
	while(T --){
		cin >> n;p.clear();
		
		for(int i = 0;i < n;i ++){
			a[i] = rd() , b[i] = rd() , h[i] = rd();
			p.push_back(a[i]) , p.push_back(b[i]);
		}p.push_back(-INF) , p.push_back(INF);
		sort(p.begin() , p.end());
		
		p.erase(unique(p.begin() , p.end()) , p.end());
		int k = p.size();
		for(int s = 1;s < k;s ++){
			for(int i = 0;i < k - s;i ++){
				int j = s + i , hst = -1;
				for(int q = 0;q < n;q ++){
					if(p[i] < a[q] && b[q] < p[j] && (hst = -1 || h[hst] < h[q]))
					hst = q;
				}
				int& df = f[i][j]; df = 0;
				if(hst != -1){
					df = INF;
					int l = lower_bound(p.begin() , p.end() , a[hst]) - p.begin();
					int r = lower_bound(p.begin() , p.end() , b[hst]) - p.begin();;
					for(int d = l;d <= r;d ++){
						df = min(df , h[hst] + f[i][d] + f[d][j]);
					}
				}
			}
		}printf("%d\n" , f[0][k - 1]);
	}return 0;
}
2021/10/4 11:03
加载中...