1. 程式人生 > >[POJ3614]Sunscreen (貪心)

[POJ3614]Sunscreen (貪心)

題意

(依然來自洛谷)

有C個奶牛去晒太陽 (1 <=C <= 2500),每個奶牛各自能夠忍受的陽光強度有一個最小值和一個最大值,太大就晒傷了,太小奶牛沒感覺。

而剛開始的陽光的強度非常大,奶牛都承受不住,然後奶牛就得塗抹防晒霜,防晒霜的作用是讓陽光照在身上的陽光強度固定為某個值。

那麼為了不讓奶牛燙傷,又不會沒有效果。

給出了L種防晒霜。每種的數量和固定的陽光強度也給出來了

每個奶牛隻能抹一瓶防晒霜,最後問能夠享受晒太陽的奶牛有幾個。

分析

依然是一道貪心,依然是一道USACO的,依然是一道李煜東書上的,依然我是做不來的

對奶牛可承受的SPF(日光)最小值排序

對沐浴露(防晒霜?)最小值排序

證明過程略(哇,好懶)

Code

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
#define N 50005
using namespace std;

int n,num;
struct COW {
    int l, r, id,ans;
    bool operator <(const COW x)
        const
{ return l < x.l; } }cow[N]; int ans[N]; priority_queue<pair<int, int> > s; int main() { //freopen("testdata.in", "r", stdin); scanf("%d", &n); for (int i = 1; i <= n; i++) { cow[i].id = i; scanf("%d%d", &cow[i].l, &cow[i].r); } sort(cow
+ 1, cow + 1 + n); for (int i = 1; i <= n; i++) { int total = s.size(); if (total && -s.top().first < cow[i].l) { cow[i].ans = s.top().second; s.pop(); s.push(make_pair(-cow[i].r, cow[i].ans)); continue; } cow[i].ans = ++num; s.push(make_pair(-cow[i].r, num)); } printf("%d\n",s.size()); for (int i = 1; i <= n; i++) ans[cow[i].id] = cow[i].ans; for (int i = 1; i <= n; i++) printf("%d\n", ans[i]); return 0; }