1. 程式人生 > >HDU 6012 Lotus and Horticulture

HDU 6012 Lotus and Horticulture

num cout ostream n) %d 如果 -- 等於 inpu

Lotus and Horticulture

題意:花有一個最適的溫度範圍 l 和 r ,如果等於這個範圍其價值為a, 高於為b,等於為c,求最大的價值

思路:如果一一枚舉肯定超時,所有把每個區間的端點都存在一個結構體裏,-1為左, 1為右,再從小到大排序,假設起點從負無窮小開始(sum = 所有的c),一一遍歷每個端點,求出最大值。

#include <iostream>
#include <queue>
#include <cstdio>
#include <algorithm>
using namespace std;
struct A
{
    
int dian; int f; int num; }p[50000*2]; int a[50005], b[50005], c[50005]; long long sum = 0; int n; int Min; int j; bool cmp(A a, A b) { if(a.dian != b.dian) return a.dian < b.dian; else return a.f < b.f; } void Input() { sum = 0; cin >> n; int l, r; j = 0; for
(int i = 0; i < n; i++) { scanf("%d%d%d%d%d", &l, &r, &a[i], &b[i], &c[i]); p[j].dian = l; p[j].f = -1; p[j].num = i; j++; p[j].dian = r; p[j].num = i; p[j].f = 1; j++; sum += c[i]; } sort(p, p
+j, cmp); } void finds() { long long Sum = 0; Sum = max(Sum, sum); for(int i = 0; i < j; i++) { int l = i; while(p[i].dian == p[i+1].dian && p[i].f == p[i+1].f)i++; for(int k = l; k <= i; k++) { if(p[k].f == -1)sum += a[p[k].num] - c[p[k].num]; else sum += b[p[k].num] - a[p[k].num]; } Sum = max(Sum, sum); } cout << Sum << endl; } int main() { int t; cin >> t; while(t--) { Input(); finds(); } return 0; }

HDU 6012 Lotus and Horticulture